{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "1c2cca7e",
   "metadata": {},
   "source": [
    "# Distilling BERT models"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "5e067f76",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(16206, 19)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>MAL_ID</th>\n",
       "      <th>Name</th>\n",
       "      <th>Score</th>\n",
       "      <th>Genres</th>\n",
       "      <th>English name</th>\n",
       "      <th>Type</th>\n",
       "      <th>Episodes</th>\n",
       "      <th>Premiered</th>\n",
       "      <th>Producers</th>\n",
       "      <th>Studios</th>\n",
       "      <th>Source</th>\n",
       "      <th>Duration</th>\n",
       "      <th>Rating</th>\n",
       "      <th>Ranked</th>\n",
       "      <th>Members</th>\n",
       "      <th>Favorites</th>\n",
       "      <th>Completed</th>\n",
       "      <th>On-Hold</th>\n",
       "      <th>synopsis</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>Cowboy Bebop</td>\n",
       "      <td>8.78</td>\n",
       "      <td>Action, Adventure, Comedy, Drama, Sci-Fi, Space</td>\n",
       "      <td>Cowboy Bebop</td>\n",
       "      <td>TV</td>\n",
       "      <td>26</td>\n",
       "      <td>Spring 1998</td>\n",
       "      <td>Bandai Visual</td>\n",
       "      <td>Sunrise</td>\n",
       "      <td>Original</td>\n",
       "      <td>24 min. per ep.</td>\n",
       "      <td>R - 17+ (violence &amp; profanity)</td>\n",
       "      <td>28.0</td>\n",
       "      <td>1251960</td>\n",
       "      <td>61971</td>\n",
       "      <td>718161</td>\n",
       "      <td>71513</td>\n",
       "      <td>In the year 2071, humanity has colonized sever...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>5</td>\n",
       "      <td>Cowboy Bebop: Tengoku no Tobira</td>\n",
       "      <td>8.39</td>\n",
       "      <td>Action, Drama, Mystery, Sci-Fi, Space</td>\n",
       "      <td>Cowboy Bebop:The Movie</td>\n",
       "      <td>Movie</td>\n",
       "      <td>1</td>\n",
       "      <td>Unknown</td>\n",
       "      <td>Sunrise, Bandai Visual</td>\n",
       "      <td>Bones</td>\n",
       "      <td>Original</td>\n",
       "      <td>1 hr. 55 min.</td>\n",
       "      <td>R - 17+ (violence &amp; profanity)</td>\n",
       "      <td>159.0</td>\n",
       "      <td>273145</td>\n",
       "      <td>1174</td>\n",
       "      <td>208333</td>\n",
       "      <td>1935</td>\n",
       "      <td>other day, another bounty—such is the life of ...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   MAL_ID                             Name Score  \\\n",
       "0       1                     Cowboy Bebop  8.78   \n",
       "1       5  Cowboy Bebop: Tengoku no Tobira  8.39   \n",
       "\n",
       "                                            Genres            English name  \\\n",
       "0  Action, Adventure, Comedy, Drama, Sci-Fi, Space            Cowboy Bebop   \n",
       "1            Action, Drama, Mystery, Sci-Fi, Space  Cowboy Bebop:The Movie   \n",
       "\n",
       "    Type Episodes    Premiered               Producers  Studios    Source  \\\n",
       "0     TV       26  Spring 1998           Bandai Visual  Sunrise  Original   \n",
       "1  Movie        1      Unknown  Sunrise, Bandai Visual    Bones  Original   \n",
       "\n",
       "          Duration                          Rating Ranked  Members  Favorites  \\\n",
       "0  24 min. per ep.  R - 17+ (violence & profanity)   28.0  1251960      61971   \n",
       "1    1 hr. 55 min.  R - 17+ (violence & profanity)  159.0   273145       1174   \n",
       "\n",
       "   Completed  On-Hold                                           synopsis  \n",
       "0     718161    71513  In the year 2071, humanity has colonized sever...  \n",
       "1     208333     1935  other day, another bounty—such is the life of ...  "
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "from transformers import AutoModelForSequenceClassification, AutoTokenizer\n",
    "\n",
    "pre_merged_anime = pd.read_csv('../data/pre_merged_anime.csv')\n",
    "print(pre_merged_anime.shape)\n",
    "pre_merged_anime.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "86f7a7a5",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "fa6ef8ce",
   "metadata": {},
   "outputs": [],
   "source": [
    "import re\n",
    "import string\n",
    "\n",
    "def clean_text(text):\n",
    "    # Remove non-printable characters\n",
    "    text = ''.join(filter(lambda x: x in string.printable, text))\n",
    "    # Replace multiple whitespace characters with a single space\n",
    "    text = re.sub(r'\\s{2,}', ' ', text).strip()\n",
    "    return text.strip()\n",
    "\n",
    "# WITH NO GENRES\n",
    "def get_anime_description(anime_row):\n",
    "    \"\"\"\n",
    "    Generates a custom description for an anime title based on various features from the input data.\n",
    "\n",
    "    :param anime_row: A row from the MyAnimeList dataset containing relevant anime information.\n",
    "    :return: A formatted string containing a custom description of the anime.\n",
    "    \"\"\"\n",
    "\n",
    "    # Determine the type of anime (TV show or other)\n",
    "    anime_type = \"TV Show\" if anime_row[\"Type\"] == \"TV\" else anime_row[\"Type\"]\n",
    "\n",
    "    # Create a formatted description using the relevant features from the input data\n",
    "    description = (\n",
    "        f\"{anime_row['Name']} is a {anime_type}.\\n\"\n",
    "        f\"Synopsis: {anime_row['synopsis']}\\n\"\n",
    "        f\"It was produced by {anime_row['Producers']} and it is from {anime_row['Studios']} Studio.\\n\"\n",
    "        f\"Its source is {anime_row['Source']}.\\n\"\n",
    "        f\"It premiered in {anime_row['Premiered']}.\"\n",
    "    )\n",
    "\n",
    "    return clean_text(description)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "bfbd1501",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Cowboy Bebop is a TV Show.\n",
      "Synopsis: In the year 2071, humanity has colonized several of the planets and moons of the solar system leaving the now uninhabitable surface of planet Earth behind. The Inter Solar System Police attempts to keep peace in the galaxy, aided in part by outlaw bounty hunters, referred to as \"Cowboys.\" The ragtag team aboard the spaceship Bebop are two such individuals. Mellow and carefree Spike Spiegel is balanced by his boisterous, pragmatic partner Jet Black as the pair makes a living chasing bounties and collecting rewards. Thrown off course by the addition of new members that they meet in their travelsEin, a genetically engineered, highly intelligent Welsh Corgi; femme fatale Faye Valentine, an enigmatic trickster with memory loss; and the strange computer whiz kid Edward Wongthe crew embarks on thrilling adventures that unravel each member's dark and mysterious past little by little. Well-balanced with high density action and light-hearted comedy, Cowboy Bebop is a space Western classic and an homage to the smooth and improvised music it is named after.\n",
      "It was produced by Bandai Visual and it is from Sunrise Studio.\n",
      "Its source is Original.\n",
      "It premiered in Spring 1998.\n"
     ]
    }
   ],
   "source": [
    "print(clean_text(get_anime_description(pre_merged_anime.iloc[0])))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "376e7066",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Create a new column in our merged anime dataframe for our new descriptions\n",
    "pre_merged_anime['generated_description'] = pre_merged_anime.apply(get_anime_description, axis=1)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9fe3309f",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "d8c26e4b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['Action', 'Adventure', 'Comedy']"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from functools import reduce\n",
    "\n",
    "all_genres = list(reduce(lambda y, z: y + z, pre_merged_anime['Genres'].map(lambda x: x.split(', '))))\n",
    "all_genres[:3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "94e41b0c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABTIAAAKACAYAAACv9YekAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdebRXZb0/8PdhkkFNOCGoiBIkxGUQrxgO5JRDmTeJynJRjoTi8Lt01W5JCg6ZqTlPISpXQkTlWmoOZKYZiKJmFqChqIAiMivzcH5/sM73cuIgh8NRdvp6rXXW+rL383z2Z3/PaS3Xu2fvp6yioqIiAAAAAAAFVm9rNwAAAAAAsCmCTAAAAACg8ASZAAAAAEDhCTIBAAAAgMITZAIAAAAAhSfIBAAAAAAKT5AJAAAAABSeIBMAAAAAKDxBJgDAVrJmzZqt3cJHZu3atVu7BQAAPmEabO0GAADq2iGHHJJZs2ZVe65evXpp3Lhxmjdvnj322CNHHHFEjjzyyDRp0mSj9Tp27JgkOfXUUzNo0KA66XHy5Mn56U9/mvvuu69W8zfW0/e+9708++yz2WuvvXLXXXfVSa+bY8aMGbngggty4YUXpk2bNqXjM2fOzKGHHpokufjii/Otb33rY+9ta5gzZ06uvvrqPP3005k/f36222679OjRIzfeeONm15o/f34eeOCBjB8/Pv/4xz8yb968rF27Ni1atEjbtm2z//775+ijj84uu+zyEdwJAMDWJ8gEAD5V1q5dm6VLl2bp0qWZNWtWnnjiiVx//fW57LLLsvfee38sPfzpT3/KgAEDPnErMl955ZV8+9vfzvLly7d2K4WwYsWKfO9738sbb7xROjZ//vw0bNhws+vccMMNueOOO7JixYoNzs+ePTuzZ8/Os88+m+uvvz7HHXdczj333DRo4D/1AYBPFv91AwB8Yv37v/97hg0bVuXYmjVrsmTJkrz55pv5/e9/n9GjR2fmzJk55ZRTcscdd2TPPffcoE7btm2TJM2bN6+Tvt57770tDjHruqe6sHDhwo2GmA0bNiz1vO22236cbW01zz//fCnEPOWUU/L9738/DRs2TFlZWY1rvP/+++nfv39efPHFJMlnP/vZHHvssdl///2z8847p3HjxnnvvfcyceLEjBo1Kq+//npGjBiRN998MzfddFPq1fMmKQDgk0OQCQB8YtWvXz/NmjXb4Pj222+fnXbaKb169cqRRx6Z/v37Z+nSpTn11FMzbty4bLfddlXGjxs37uNqucaK2NOHadWq1b9cz1vqvffeK30+7bTTahXg/td//VcpxOzTp0/OP//8NG3atMqYytckfPe7380ll1ySUaNG5Y9//GNGjx6d4447bstuAgCgQPxftADAp9ree++dwYMHJ0kWLFiQ2267bSt3xCfF+qtuaxNiPvjgg3nyySeTJF/5ylfy85//fIMQc30NGjTI+eefn+7duydJfvWrX6WiomKzrwsAUFSCTADgU+8b3/hGPve5zyVJRo0atcGO2x07dkzHjh1z1VVXbTD3tddeywUXXJAjjjgiXbt2TY8ePXLkkUfm/PPPzyuvvFJl7MSJE9OxY8f8+Mc/3qD22LFjkyRjx45Nx44d86UvfSnLly/PhRdemH322Sd77rlnjj766IwfP36TPVVatWpVbr311nzta19Lt27dst9+++XMM8/MM888U+34ymt37Ngxb775ZrVjZs6cWRpzzz33VDn2/e9/vzTu0EMPTceOHXPddddtdN4/mzp1agYPHpzDDjss3bp1y7//+7+nT58+ufrqq7NgwYJq51x33XXp2LFjvvvd7yZJnn766Zx66qnZb7/90rVr1xx66KG56KKL8u677270e9qUNWvW5Le//W1OOeWU7LvvvunSpUv233///OAHP8iDDz64QVhY2VN1v+dDDjmkxte9+eabkyTNmjXLBRdcUKM5ZWVl+cEPfpAk+eCDD/L6669XO27BggW5+uqr8/Wvfz177bVXunfvniOPPDKXXHJJ3nnnnWrnrP+3mSR//etfM2jQoBxwwAHp0qVLDjzwwPz4xz/Oa6+9Vu38yu9g/Pjx+d3vfpcjjzwyXbp0yZe+9KVcdtllVcYuXbo0w4YNy7e//e307Nmz9LscPHjwRusn635X99xzT44//vh88YtfTJcuXbLffvvlhBNOyKhRo7Jy5cpNfocAQHF5tBwA+NQrKyvLkUcemRtvvDELFy7M5MmT06VLl03Oe/LJJ3PmmWdW2YBl5cqVmT59eqZPn54xY8bkggsuKIVsm6OioiI//OEP8/jjj5eOTZs2rRS4bsqKFStyyimnVAktV6xYkcceeyyPPfZYTjjhhCpB29Z2/fXX54YbbqgSIq9YsSKTJ0/O5MmTM2rUqFxzzTXZd999N1rj2muvzQ033FDl2MyZMzNy5Mj89re/zZ133plOnTptVl/z5s3LGWeckRdeeKHK8blz5+bJJ5/Mk08+mTFjxuTaa6/NDjvssFm1P8zf//73/OMf/0iSHHnkkZv1LtQDDzwwd955Z/baa69qN/x55plnctZZZ2XRokVVjq//d/uLX/wiRxxxxEavcc899+SCCy6osup09uzZGTt2bB588MHccsst2W+//aqd+9hjj+Wuu+4q/fvdd9+t8t298sorOfXUU/P2229XmTdz5szcc889GTt2bH784x/ne9/7XpXzK1euzA9+8INMmDChyvF58+ZlwoQJmTBhQu66666MGDEiLVq02Oi9AQDFZUUmAECSf/u3fyt9rnwn4YdZunRpzj333KxYsSLdunXLbbfdlqeeeip/+tOfctNNN+Vzn/tcKioqcskll2TWrFlJ1j3G/sILL2To0KGlOi+88EJeeOGF/Md//EeV+nPmzMnjjz+e7373u3niiSfyyCOP5Gc/+1lat25do/v5+9//nmeeeSYHHXRQ7rnnnjzzzDMZOXJkevTokSS544478utf/7pGtTZll112yQsvvJBf/epXpWMPPfRQXnjhhQwYMGCT82+//fZcd911Wbt2bTp37pybb745EyZMyBNPPJGhQ4emRYsWWbRoUQYMGJApU6ZUW2PKlCm54YYb0qNHjwwfPjzPPPNMHn744VLYtXjx4lx88cWbdV+VwdgLL7yQsrKyfPe7383999+fiRMn5v7778+xxx6bZN1K24EDB2b16tVJkgEDBmz09/zQQw/V6Np//vOfS58PPvjgzeq7YcOG2WeffaoNMV999dUMGDAgixYtSps2bfKLX/wiTz31VMaPH59f/epX6dq1a5YvX54f/vCHef7556utP3/+/FxwwQXZfffdc91112X8+PF5/PHHc+aZZ6Z+/fpZuXJlBg8evMHK5kp33XVXPv/5z+euu+7K008/nSuuuCJ9+vRJsu7v/sQTT8zbb7+dFi1a5IILLsgf/vCHPPPMM7nzzjtzwAEHZM2aNbn44os3+C5vv/32TJgwIfXr189//ud/5ne/+12eeeaZ/O53v8tJJ51Uuv+rr756s75PAKA4BJkAAFkXxlWaO3fuJsc/++yzWbhwYZJ1jxLvv//+adWqVXbccccccsghGTZsWOrVq5dVq1blscceS/J/mw81atSoVKdZs2Zp1qxZtaHT3nvvnSFDhmTnnXdOu3btSmFPTR1xxBG56aab0q1btzRv3jw9e/bMiBEj0rVr1yTrVjCuv5q0tsrKytKsWbM0bty4dKxx48Yb3Gt15s6dm2uuuSZJ0qNHj9x11105+OCD06JFi+y88875zne+k9GjR2f77bfPihUrcv7551dbZ9myZenevXsp7GrevHk+97nPZfDgwaWVhZMmTcr8+fNrfF9jxozJ3/72tyTJj3/84wwZMiRf+MIXssMOO+QLX/hCLrzwwvzoRz9Ksm6H8rvvvjtJ0qhRo43+nps0aVKja1euxkzWPZJdVy688MIsX748bdq0yb333puvf/3radWqVcrLy3PggQdm1KhR6d69e1avXl0liF3fqlWrstNOO2XMmDE5/PDDU15enjZt2uSMM87I8ccfnySZNWtWJk+eXO38evXq5frrr89ee+2Vli1b5uijj86OO+6YJLnyyiszb968fOYzn8ndd9+d4447LrvsskuaN2+effbZJ8OGDcvhhx+eJLnkkkuq/P1W/u+sT58+Oe2009K+ffs0b9487du3z49+9KP07ds3SfLwww9vNGQFAIpNkAkAkFTZRKUyoPww6wco1QWfbdq0ya9+9avcc889+eY3v1mrnioDm9po0KBBfvrTn6Zevar/ubfNNtvk7LPPTrLuPp944olaX6MuPPjgg1m2bFmSZMiQIVXC0Eq77bZbTj/99CTr3stYGS7+s5NOOikNGzbc4PiBBx6YZN3j+pWrY2tizJgxSZIvfOELpYCuumtWBo2jR4+uce1NWT9w/exnP7vRcStWrMiSJUs2+rP+OyGnTZuW5557LkkycODAah9Xb9SoUQYNGpRk3SPeL730UrXXPe6446rdwKjyu07WPQpenY4dO2b33Xff4PjixYtLqyz79euXtm3bbjCmXr16Oeecc5Kse2R8/VcvVN7rvHnzqr3uwIEDM3z48Nx7770pKyurdgwAUGyCTACApErgU5OQY8899yytojzxxBNzxRVX5Pnnn6/yzsDevXunW7du2W677WrV0xe+8IVazUvWrW5s2bJltef22WefUnA7adKkWl+jLjz77LNJkrZt237o+yuPPPLI0ufKMO6fVe7W/c/Ky8tLn5cvX16jvhYuXJhXX301yaYD5creXn311Y1uSrS5arrb+IABA7LXXntt9Gf9FawTJ04sfd5jjz02Gn527Ngx9evXT5KNPl6+Jd/1xv6uX3zxxaxatSpJ0qlTp432V15eXvrbXr+/vffeO0nyxBNP5Pvf/37Gjh2b9957r3S+TZs2OeCAA7LbbrsJMgHgX5TNfgAAkrz//vulz9tvv/0mx7dq1SqDBg3K5ZdfnsWLF2fYsGEZNmxYtt9+++y777458MADc+ihh27RBjBbMvfDNgWqV69e2rRpk1dffXWDDVU+brNnz06StG/f/kPHtW7dOk2bNs3SpUs32vPGNsRZ/xHvmj5S/O6775bCxE31tv752bNnb9bGPBvzmc98pvR57ty51a5O3FwzZswofa7pKuGN7WC+Jd/1xv6u33rrrdLnM888c7P7O/300/OnP/0pM2bMyMSJEzNx4sSUlZWVdlo/9NBDs+eee9aoLgBQTFZkAgCkasjTpk2bGs055ZRTcscdd+RLX/pS6ZHmxYsX59FHH81PfvKTHHDAAbnssstKm8Bsrm222aZW85Js8l2MlSsya7pC8aPywQcfJKn6aP/GVI5ZunRpteere8/olva1/nU3Zv3vesmSJXVy/fXD0fX/Nv/ZHXfckVdeeWWDn1atWm0wdv17qqmNzdmS73pj703d0v4++9nP5v7778+pp56anXfeOcm6la1Tp07Nr371qxx77LE5+uijN/q4PABQfFZkAgAkVcKNbt261Xjevvvum3333TcffPBBxo8fnwkTJuTpp5/OW2+9lVWrVuW2227LqlWrMnjw4I+i7Y3aVEBZGbht7mPvdbE50Po2FU6ur7Lnmm6YsyWaNWtW+ryp3jYn9KypXr165brrrkuS/P73v8/++++/xTXXf//oX//61y0Kyj8K6/9eH3744Q9dVbwx2267bQYNGpRBgwZl6tSp+fOf/5zx48fnueeey4oVK/Lqq6/mxBNPzIMPPlgKOwGAfx1WZAIAn3rr7yy+yy671GqX6G233TaHH354LrjggowbNy733HNPaSf0u+++u8o7OD8OH7apzerVq0uP8a7/yPL6GwNtbBVpXb0DslJlmPTaa6996LhZs2aVNgVaf4f5j8pOO+1Ueo/ipnp7/fXXS5/rKhzba6+9Sr+bhx9+OIsWLdrimuv3trGNeCrV9B2ddWmnnXYqfa6L/jp16pSTTz45w4cPz4QJE9K/f/8k6wLxsWPHblmzAMBWIcgEAD717rnnntKmIN/61rdqtBHILbfckq997Wv57ne/W+35bt265fvf/36SdRsJrR8Afhwbjbz44oul4O+fPfXUU6WVlZUbpCRVVxNuLLB88cUXN3rN2txX5fXfeuutTJkyZaPjHn300dLnHj16bPZ1NtdnPvOZfP7zn0+SUsi9MZW9tWvXbovea7q+evXqZeDAgUnW/S5++tOf1nhuRUVFte+nXP93vf5u3//shRdeSPfu3XPEEUfk4Ycf3oyut8xee+1V+hv6sP5mzZqVHj165Mtf/nL+53/+p3Tse9/7Xvbbb788+eSTG8xp1qxZzj777NIK5HffffcjuAMA4KMmyAQAPtWef/75/OIXv0iybkOZE044oUbzGjRokH/84x958cUX88ILL1Q7pjKYa9q0aZUdxCt3hE7yka3U/OCDD3LNNddscPz999/P5ZdfnmTdysYDDjigdG791ZmPPPLIBnPnz5+fO++8c6PXXP++Knef3pRjjjmm9Ijz0KFDq30kfsaMGbn55puTrNtte2M7Zte1b3/720nW/R5HjBhR7Zg77rijtLv5t771rTq9fp8+fXLIIYckWReWnnXWWVm4cOGHznnjjTdyyimnVNmtu1K3bt1KO8MPGzYsb7zxxgZjli9fnssuuywrVqzIrFmzNus1C1uqZcuWOfjgg5Mk9913X7U7pq9duzaXXnppli1blhkzZqRLly6lua+88krmzZuXO++8s9oVmzNmzCi9BqAuNk8CAD5+gkwA4BNrzZo1WbJkSZWfhQsXZsaMGfnjH/+Y8847L8cff3yWLVuWxo0b59prr63x+xf79u2bHXbYIRUVFRk4cGBGjhyZ119/PfPnz8/UqVNz0UUX5f7770+SHHfccVUe215/1d7//u//ZuHChXW2SUyl+vXr5/bbb895552XV199NQsWLMhTTz2V4447Lq+//nrKysoyZMiQKuFjx44ds+uuuyZJRo4cmeuvvz4zZ87Mu+++mwceeCDf/va3M3/+/I2+B3L9+3rggQcyf/78TW7g0qJFiwwaNCjJutWexx13XP74xz9m/vz5mT17dsaMGZPvfOc7WbRoURo2bJjLLrvsY1nRmiTHHntsKSi79NJLM3To0EydOjWLFi3K1KlTM3To0Pz85z9Psm6V6PHHH1/nPfzyl79M7969k6wLM4844ohcdNFFGT9+fGbMmJEFCxZk2rRpuf/++3P66afnq1/9ap5++ukkya677ppvfOMbVepdcMEFadCgQRYvXpxjjz02I0eOzMyZMzNv3rw8/fTTOeGEE/KXv/wlSXLyySd/LI/xr++///u/s+2222bVqlU5+eSTc9NNN+WNN97I/PnzM2nSpJx22mkZN25ckuRrX/ta9tprryTrNhCqXAH9pz/9Kaeddlqee+65zJ07N7NmzcojjzySU045JRUVFWnatOkG3wsA8K/BZj8AwCfW888/Xwo6Psyuu+6aX/7yl5u1+myHHXbI1VdfnYEDB2bBggW56KKLqh138MEH5//9v/9X5ViXLl3StGnTLF26NOeff37OP//8nHHGGTnzzDNrfP1N+Y//+I+88soruffee3PvvfdWOdegQYMMGTIkX/rSl6ocLysry4UXXphTTz01K1asyHXXXVfacCZJGjZsmJ///Oe55pprSu/YXN9uu+2WnXbaKe+8805uuOGG3HDDDenTp08p7NuYE088MUuWLMn111+fv//97xkwYMAGY1q0aJErr7wynTt33pyvYYs0atQot9xyS04//fT85S9/yahRozJq1KgNxu2///654oor6nTX9EpNmjTJLbfckpEjR+bGG2/MwoULM3LkyIwcOXKjc1q2bJl+/frlhBNOqLLBT7Lu8e1rr702Z599dhYuXJiLLrqo2r/db33rWznrrLPq/H42Zbfddsutt96aM844I3Pnzs3VV1+dq6++eoNxBx98cC6++OIqxwYMGJDJkyfn8ccfzxNPPJEnnnhig3nNmjXLddddl/Ly8o/sHgCAj44gEwD4VKlXr16aNGmSVq1apVOnTjnkkENy5JFHpmHDhptda999981DDz2UESNGZPz48Zk5c2ZWrVqV5s2bp0uXLjnmmGNyxBFHbDCvRYsWufnmm3PllVfmlVdeSYMGDepkM5f1NW3aNKNGjcrNN9+chx56KLNnz84OO+yQXr165Qc/+EH22GOPauftt99++c1vfpNhw4Zl/PjxmTt3bpo3b5599tkn/fv3T6dOnap9ZD1ZF5DefPPN+dnPfpaXX345SWq80vSMM84ovfPw2WefzZw5c9KkSZPsuuuuOfzww/PNb34zLVq0qN2XsQU++9nPZtSoUXnggQfywAMPZPLkyXn//ffTsmXLdOzYMX379s2hhx5aZcVtXatfv36OP/74HHvssXnkkUfy1FNP5e9//3vmzJmTlStX5jOf+Ux23HHH9OjRI/vtt18OOuigD/17PvTQQzNu3LjceeedefLJJzNjxoysWLEizZs3T48ePXLsscfWyS7ptdWjR4888sgjGTVqVP7whz9k+vTpWbJkSbbffvt07do1ffr0yVe+8pUN5jVs2DA33HBDHnroofzmN7/J5MmTs3DhwjRu3Dg777xzvvSlL+X444/PjjvuuBXuCgCoC2UVW2NLQgAAAACAzeAdmQAAAABA4QkyAQAAAIDCE2QCAAAAAIUnyAQAAAAACk+QCQAAAAAUniATAAAAACi8Blu7gX91L774YioqKtKwYcOt3QoAAAAA/MtZtWpVysrK0qNHjw8dJ8jcQhUVFamoqNjabQAAAADAv6SaZmuCzC1UuRKza9euW7kTAAAAAPjX8/LLL9donHdkAgAAAACFJ8gEAAAAAApPkAkAAAAAFJ4gEwAAAAAoPEEmAAAAAFB4gkwAAAAAoPAEmQAAAABA4QkyAQAAAIDCE2QCAAAAAIUnyAQAAAAACk+QCQAAAAAUniATAAAAACg8QSYAAAAAUHiFCzLvv//+fPWrX03Xrl1z1FFH5eGHHy6dmzJlSvr165c999wzBx10UIYPH15l7tq1a3Pttdemd+/e6d69e0466aS8+eabVcZsqgYAAAAAUDyFCjJ/85vf5Cc/+UmOPfbYPPjgg/nqV7+aH/7wh3nxxRezYMGCnHjiidl9991z33335cwzz8w111yT++67rzT/xhtvzOjRo3PxxRfn7rvvTllZWfr375+VK1cmSY1qAAAAAADF02BrN1CpoqIi11xzTY4//vgcf/zxSZLTTz89L7zwQp599tk8++yzadSoUYYMGZIGDRqkffv2efPNNzNs2LD07ds3K1euzG233ZZzzjknBx54YJLkqquuSu/evTNu3LgcddRRGTNmzIfWAAAAAACKqTBB5uuvv55Zs2bl6KOPrnK88tHv/v37p2fPnmnQ4P9a7tWrV2655ZbMmzcvs2bNypIlS9KrV6/S+e233z6dO3fOc889l6OOOiqTJk360Brl5eW16r2ioiJLly6t1VwAAAAA+DSrqKhIWVnZJscVJsh84403kiRLly7NySefnMmTJ6dNmzY57bTT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ZAIAAAAAhSfIBAAAAAAKT5AJAAAAABSeIBMAAAAAKDxBJgAAAABQeIJMAAAAAKDwBJkAAAAAQOEJMgEAAACAwitskDl9+vT06NEjY8eOLR2bMmVK+vXrlz333DMHHXRQhg8fXmXO2rVrc+2116Z3797p3r17TjrppLz55ptVxmyqBgAAAABQPIUMMletWpWzzz47S5cuLR1bsGBBTjzxxOy+++657777cuaZZ+aaa67JfffdVxpz4403ZvTo0bn44otz9913p6ysLP3798/KlStrXAMAAAAAKJ4GW7uB6lx33XVp1qxZlWNjxoxJo0aNMmTIkDRo0CDt27fPm2++mWHDhqVv375ZuXJlbrvttpxzzjk58MADkyRXXXVVevfunXHjxuWoo47aZA0AAAAAoJgKtyLzueeey913353LLrusyvFJkyalZ8+eadDg/7LXXr16Zfr06Zk3b16mTp2aJUuWpFevXqXz22+/fTp37pznnnuuRjUAAAAAgGIq1IrMxYsX59xzz83gwYOz0047VTk3e/bs7LHHHlWO7bjjjkmSt99+O7Nnz06SDebtuOOOeeedd2pUo7y8vFZ9V1RUZOnSpSkrK0uTJk1qVaOmli1bloqKio/0GgAAAADwcamoqEhZWdkmxxUqyBwyZEj23HPPHH300RucW758eRo1alTl2DbbbJMkWbFiRZYtW5Yk1Y5ZtGhRjWrU1qpVqzJlypQ0adIknTt3rnWdmpg+fXrpXgEAAADgk+CfM7vqFCbIvP/++zNp0qQ88MAD1Z5v3LhxadOeSpXhY9OmTdO4ceMkycqVK0ufK8dUrpLcVI3aatiwYTp06FCj5HhLtWvXzopMAAAAAD4xpk2bVqNxhQky77vvvsybNy8HHXRQleMXXHBBhg8fnp133jlz5sypcq7y361atcrq1atLx9q2bVtlTKdOnZIkrVu3/tAatVVWVrZFQejm+KgfXQcAAACAj1NNFwcWJsi84oorsnz58irHDj/88Jx11ln56le/moceeiijR4/OmjVrUr9+/STJhAkT0q5du5SXl2e77bbLtttum4kTJ5aCzMWLF2fy5Mnp169fkqRnz54fWgMAAAAAKKbC7FreqlWr7LbbblV+kqS8vDy77LJL+vbtmw8++CDnnXdepk2blrFjx2bEiBEZMGBAknXP0ffr1y9XXHFFHn/88UydOjWDBg1K69atc9hhhyXJJmsAAAAAAMVUmBWZm1JeXp5bb701l1xySfr06ZOWLVvm3HPPTZ8+fUpjzjrrrKxevTqDBw/O8uXL07NnzwwfPrz0stCa1AAAAAAAiqesws4xW+Tll19OknTt2rV07Pd/W5CFS1fX6XV2aNogX+7SvE5rAgAAAMDWVl2+Vp3CPFoOAAAAALAxgkwAAAAAoPAEmQAAAABA4QkyAQAAAIDCE2R+AlRUrP2Xrg8AAAAAm9JgazfAlisrq5clLz2atUsW1Hntes2ap1n3I+q8LgAAAABsDkHmJ8TaJQuyZvF7W7sNAAAAAPhIeLQcAAAAACg8QSYAAAAAUHiCTAAAAACg8ASZAAAAAEDhCTIBAAAAgMITZAIAAAAAhSfIBAAAAAAKT5AJAAAAABSeIBMAAAAAKDxBJgAAAABQeIJMAAAAAKDwBJkAAAAAQOEJMgEAAACAwhNkAgAAAACFJ8gEAAAAAApPkAkAAAAAFJ4gEwAAAAAoPEEmAAAAAFB4gkwAAAAAoPAEmQAAAABA4QkyAQAAAIDCE2QCAAAAAIUnyAQAAAAACk+QCQAAAAAUniATAAAAACg8QSYAAAAAUHi1DjJ//OMf56WXXtro+QkTJuTkk0+ubXkAAAAAgJJaB5n/+7//mxkzZmz0/LPPPptnn322tuUBAAAAAEoa1HTgW2+9laOOOiqrV68uHTvnnHNyzjnnbHTO5z//+S3rDgAAAAAgmxFktm3bNmeddVaeeuqpJMmkSZPSrl27lJeXbzC2fv36KS8vT//+/euuUwAAAADgU6vGQWaS9O/fvxROdurUKaeddlqOPvroj6QxAAAAAIBKmxVkrm/q1Kl12QcAAAAAwEbVOsis9NZbb+W9997L2rVrqz3fs2fPLb0EAAAAAPApV+sgc+7cuRk0aFAmTZr0oeOmTJlS20sAAAAAACTZgiDzyiuvzHPPPZd99903Xbt2TaNGjeqyLwAAAACAkloHmX/84x9z1FFH5corr6zLfgAAAAAANlCvthOXLl2aXr161WUvAAAAAADVqnWQ2aFDh0yfPr0uewEAAAAAqFatg8wBAwbk7rvvzssvv1yX/QAAAAAAbKDW78h89tlns8MOO+Tb3/52dtttt7Rs2TJlZWVVxpSVlWXEiBFb3CQAAAAA8OlW6yBz5MiRpc9vvPFG3njjjQ3G/HOwCQAAAABQG7UOMqdOnVqXfQAAAAAAbFSt35EJAAAAAPBxqfWKzPvvv79G44455pjaXgIAAAAAIMkWBJn//d//XaN3YAoyAQAAAIAtVesg89JLL93g2OrVqzN37tz87ne/S0VFRX72s59tUXMU29qKitT7iDZ0+ihrAwAAAPCvp9ZBZp8+fTZ67uSTT843v/nN/PGPf0y3bt1qewkKrl5ZWR6fPSELVy6u07o7NNo+h7bet05rAgAAAPCvrdZB5odp1KhRvvGNb+R//ud/ctZZZ30Ul6AgFq5cnLkrFmztNgAAAAD4hPvIdi2vX79+5s6d+1GVBwAAAAA+RT6SIPOdd97JqFGjsuuuu34U5QEAAACAT5laP1p+6KGHVnt8xYoVmT9/ftauXZuf/vSntW4MAAAAAKBSrYPMioqKao83bdo0u+++e/r27fuhGwIBAAAAANRUrYPMP/zhD3XZBwAAAADARtXJOzIrKioyf/78fPDBB3VRDgAAAACgilqvyEySBQsW5PLLL89jjz2WJUuWJEm23XbbHHHEEfnhD3+YFi1a1EmTAAAAAMCnW61XZC5evDjf+c53Mnbs2JSXl+eQQw7JgQcemObNm+fee+/Nscceu9krNOfNm5dzzjknvXr1So8ePfKDH/wg06ZNK52fMmVK+vXrlz333DMHHXRQhg8fXmX+2rVrc+2116Z3797p3r17TjrppLz55ptVxmyqBgAAAABQPLUOMm+66aa89dZbueiii/Loo4/mhhtuyM0335zHHnssF198cWbOnJlbbrlls2qedtppmTFjRoYNG5Z77703jRs3zgknnJBly5ZlwYIFOfHEE7P77rvnvvvuy5lnnplrrrkm9913X2n+jTfemNGjR+fiiy/O3XffnbKysvTv3z8rV65MkhrVAAAAAACKp9ZB5rhx4/L1r3893/rWtzY4981vfjPHHHNMHnvssRrXW7BgQdq0aZOLLrooXbt2Tfv27TNw4MC89957+cc//pExY8akUaNGGTJkSNq3b5++ffvmhBNOyLBhw5IkK1euzG233ZYzzzwzBx54YDp16pSrrroq7777bsaNG5ckm6wBAAAAABRTrYPM2bNnZ88999zo+e7du+edd96pcb3mzZvnl7/8ZT7/+c8nSebOnZvhw4endevW6dChQyZNmpSePXumQYP/e61nr169Mn369MybNy9Tp07NkiVL0qtXr9L57bffPp07d85zzz2XJJusAQAAAAAUU603+/nMZz6Tt99+e6PnZ86cmW233bZWtX/605+WVk/edNNNadq0aWbPnp099tijyrgdd9wxSfL2229n9uzZSZKddtppgzGVgeqmapSXl9eq34qKiixdujRlZWVp0qRJrWrU1LJly1JRUVH698dxza113X++JgAAAACfPBUVFSkrK9vkuFoHmV/84hczatSo9OnTJ+3ataty7rXXXstdd92V3r1716r28ccfn2OPPTZ33XVXTj/99IwaNSrLly9Po0aNqozbZpttkiQrVqzIsmXLkqTaMYsWLUqSTdaorVWrVmXKlClp0qRJOnfuXOs6NTF9+vTSvSb5WK65ta77z9cEAAAA4JPpnzO76tQ6yDz99NPzhz/8Icccc0y+/vWvp3379ikrK8s//vGP/Pa3v01ZWVkGDhxYq9odOnRIklx00UX5y1/+kpEjR6Zx48alTXsqVYaPTZs2TePGjZOse1dm5efKMZUrBzdVo7YaNmyYDh061Cg53lLt2rXbYGXkx2FrXPefrwkAAADAJ8+0adNqNK7WQWb79u1z66235ic/+UnGjBlT5dyuu+6aiy++eIPHuD/MvHnzMmHChHzlK19J/fr1kyT16tVL+/btM2fOnLRu3Tpz5sypMqfy361atcrq1atLx9q2bVtlTKdOnZJkkzVqq6ysbIuC0M3xcTxGXpTrbq17BQAAAODjU9MFc7UOMpNk7733zqOPPprJkyfnrbfeSkVFRdq2bZvOnTunXr3N20dozpw5+a//+q+Ul5dn3333TbLuke3JkyfnkEMOyWc/+9mMHj06a9asKQWdEyZMSLt27VJeXp7tttsu2267bSZOnFgKMhcvXpzJkyenX79+SZKePXt+aA0AAAAAoJhqvWt5pbKysvzbv/1bvvKVr2SfffZJp06dNjvETJJOnTrlgAMOyNChQzNp0qS8+uqr+dGPfpTFixfnhBNOSN++ffPBBx/kvPPOy7Rp0zJ27NiMGDEiAwYMSLLuOfp+/frliiuuyOOPP56pU6dm0KBBad26dQ477LAk2WQNiu+jftTco+wAAAAAxbTZKzLvvffejBw5MmPHjt0gsLzssssyfvz4nHnmmfnOd76zWXXLyspy9dVX58orr8x//ud/5v3338/ee++dX//619l5552TJLfeemsuueSS9OnTJy1btsy5556bPn36lGqcddZZWb16dQYPHpzly5enZ8+eGT58eOlloeXl5ZusQbGVlZVl+cRnsvb9xXVeu95226fxF3vVeV0AAAAAttxmBZmXX355hg8fngYNGuSNN97I5z73uarFGjTIokWLMnTo0EybNi2DBw/erGa22267DBkyJEOGDKn2fLdu3XL33XdvdH79+vVzzjnn5JxzztnomE3VoPjWvr84axcu2NptAAAAAPAxqvEz4E888USGDx+effbZJ4888sgGIWaSXHrppRk3bly6du2aX//61/nzn/9cp80CAAAAAJ9ONQ4yR40alV122SXDhw9PmzZtNjpup512yvDhw9O8efOMHDmyTpoEAAAAAD7dahxkvvzyy+nTp08aNmy4ybHbbbddjjnmmLz00ktb1BwAAAAAQLIZQeaSJUvSqlWrGhdu165d3n///Vo1BQAAAACwvhoHmS1btsx7771X48Lz589PeXl5rZoCAAAAAFhfjYPMLl265PHHH69x4cceeyy77757bXoCAAAAAKiixkFmnz598ve//z133HHHJsfecccdmTx5cvr06bMlvQEAAAAAJEka1HTgwQcfnMMPPzyXXXZZXnrppfTr1y/du3dPgwbrSqxatSovvvhifv3rX+exxx5Lz549c9RRR31kjQMAAAAAnx41DjKT5NJLL029evXy8MMP55FHHkn9+vWzww47ZM2aNVm8eHHWrl2bioqKHHbYYfnZz35WCjkBAAAAALbEZiWNzZo1y9VXX52nn346999/f15++eXMmTMn9evXz+67756ePXvma1/7Wvbee++Pql8AAAAA4FOoVksmDzjggBxwwAF13QsAAAAAQLVqvNkPAAAAAMDWIsgEAAAAAApPkAkAAAAAFJ4gEwAAAAAoPEEmAAAAAFB4gkwAAAAAoPAEmQAAAABA4QkyoQYqKir+JWsDAAAAfFI02NoNwL+CsrKyzHhlZVYsrdvQcZumZdm1Y6M6rQkAAADwSSTIhBpasbQiy5dYPQkAAACwNXi0HAAAAAAoPEEmAAAAAPD/2bvzOJ/q////9zPGGHsaYt59CiETYohQ2U2laTG8RTIlkgpZp4Vkp2RJhCyTVkvZGdmKyltCZckWxpI164xZvGbm9fz94TuvnzFjSee85mXcrpfLXC7jnOP5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VFOmTFGxYsXUuXPn7N414JqtX79ee/bs0eOPP66jR4+qZMmSyp07d3bvFgDAIffff7+mT5+uMmXKZPeuANft119/ValSpXTrrbdq3rx5WrJkiapVq6aXXnpJlmVl9+4BPs3lcumvv/7SnXfeKWOM4+f+zZo109ChQxUSEuJonPXr16tq1ary9/fX+vXrr7htjRo1HN0Xp7311lvq06ePChQooLfeeuuK2w4bNsxLe5Uz+Wf3DtxMNm7cqGnTpqlixYpq3ry5wsPDVahQIUdjzp49W++8847S0tIyrbMsy9FEZlpamnLlyuVY+5dauHChRo4cqeeff15TpkyRJJUpU0YjRoxQnjx51KFDB6/tiySdOnVKt956q1djpktOTlZgYKAtbTVq1EjffPONihQpooYNG17xRHTlypW2xPQVSUlJ2rVrl1JSUjLdtXTii/bcuXN68cUX9fvvv8uyLD344IMaMWKE9u3bp2nTpqlEiRK2x/S2q32pX8zOL/jsinuzOnPmjM6cOaNSpUpJkmJiYlS7dm0VKVLE0bgbN27Uxo0bs/zM5qQbWmfOnNEtt9zi9bjJycny8/NTQECA9uzZo1WrVqlq1aqqVq2ao3G///57TZw4UTt37pS/v7/Kli2r9u3bKywszLGY3n6NS5UqpZ07d2ZLItPb52vZKTk5Wd9++6327Nmj9u3ba9euXSpbtmy2na85acGCBapXr54KFy7slXgzZszQgAEDFB0draCgIL311luqXbu2PvnkE6WkpDjaB69evVpTpkxRbGysZs6cqdmzZ+vOO+/McQM24B3eTsgbYzRy5Eh9/vnnSklJ0dKlSzV69GjlyZNHAwcOdCyheejQIeXLl8+Rti8WGRmpNWvWKCgoSJGRkbIsK8vRoJZlafv27bbFzY6k4l9//SW32+35PSebN2+eHnvsMQUEBGjevHlX3NaJvphEphfNmjVLsbGxmjdvniZPnqx3331XjRo1UrNmzfTggw860jFOmDBBzZo10xtvvKECBQrY3v6V1K1bV0899ZSaNWumsmXLOh4vOjpaffr0UUREhKKjoyVJzz33nAoWLKgJEyY4msiMi4vT+++/rzZt2ngusNatW6dSpUpp0qRJuuOOO2yPefbsWU2YMEE7d+70JKqNMUpJSdGff/6pjRs32hInIiLCkxSNiIjItjvq33zzjfLly6fHHntM0oWkRFhYmJ566ilH4q1atUpRUVE6d+5cpi9bu79o040aNUqStHz5cj355JOSpNdff129evXS8OHDPeudsmPHDn366aeKjY3VmDFjtGLFCpUpU0a1atWyLUZ2falnV9znnnvumrf97LPPbI/vcrk0c+bMDP1E+vItW7Zo2bJltsfcvHmzOnTo4PnukaT3339fKSkpio6O1t133217TEmaNGmSRo0apcKFCyt//vwZ1lmWZetFdHaPLnjooYfUsGFDNW/eXHXq1JGfn/OVgtavX69OnTppzJgxKlu2rFq0aCE/Pz8lJiZq5MiRatKkiSNxV6xYoS5duigsLEzh4eFyu91av369unbtqrFjx6pRo0aOxPX2a1yuXDn16tVLU6ZMUalSpZQnT54M6528weLt87V0qampOnnyZIZzGJfLpU2bNjly0XPixAm1atVKJ06ckMvl0tNPP63o6Ght2bJFn332mdeSyKdOndIvv/yiihUrOnJ+mG7w4MGqWLGi1xKZn376qd5++23Vrl1bY8aMUbly5RQdHa0ffvhB/fv3dyyRuWbNGnXu3Fnh4eHatGmT3G630tLS1Lt3b6Wlpal58+aOxD148KBGjBihP//8U+fPn8+03s6b++PGjbvmbZ16nb2VLL7nnnv0008/KSgoSCEhIVe87nDiXDw7EvKff/655s+fr379+mngwIGSpMaNG2vAgAEKCgpSr169bI8pSR06dFCfPn3Uvn173XnnnZkGwfznP/+xJc7KlSs9N4u8OeglO5KKn3/+eZa/XyohIcHR/UhKStK0adMue3PfjmuON998U3Xq1FFQUJDefPPNy27n1OA5ppZno19++UXLli3T7NmzVbhwYTVr1kwtW7ZU8eLFbYtRuXJlzZ8/X6VLl7atzWs1ffp0zZ8/X7///rvuvfdezyjUggULOhIvNDRUCxcu1B133KGqVatqwYIFuuOOO3Tw4EGFh4dr8+bNjsSVLtzx2bBhgyZOnKi9e/eqR48eGjp0qBYvXqzcuXNr7Nixtsfs2bOn1qxZo4ceekgxMTEKDw/Xnj17tG3bNvXo0UMvvfSS7TGzy7Rp0/TBBx+ob9++nhPSoUOHatasWerTp49atGhhe8zHH39cd9xxh7p27Zrle/b222+3PWaDBg00cuRIVatWLcN7eNOmTXr55Ze1du1a22Om27p1q1q3bq0qVarot99+05IlS/Txxx9r7ty5GjdunBo0aOBY7Jwsu0eC9u/fX3PmzFHFihW1adMmVa1aVfv379fJkyfVtm1bT6LRTm3atFHp0qXVt29fBQQESLow4qtv3746evSo50aT3erWravmzZura9eujrR/sZCQEM/ogvQLLW+MLkj3ww8/aP78+Vq5cqUKFiyop556ShEREY4mYp555hmVKlVKffr00ezZszV16lTPOczXX3991bvx1ysiIkKNGzdWp06dMiwfN26cVq1apW+++caRuN5+jSMjI6+4/koXRP+Wt8/XJGnt2rWKiorSyZMnM60LDAzUb7/9ZnvMXr166dy5cxo9erQeeOABLViwQIUKFVKPHj2UK1cuTZo0yfaYkrRr1y516dJFgwcPVkhIiJo0aaITJ04oICBAkyZNsvVm4cWefvpptW3b1nMD2Gn33nuvli1bpuDgYD399NO6//771atXLx0+fFiPPvqoY+fhrVq10qOPPqq2bdtmOHeaOnWq5s6dq0WLFjkS95lnntHff/+tJk2aZLrxINmbUGzYsOE1bWdZliOJojVr1ujll19WeHi4YmJitHjxYn3zzTeaPHmyBg0aZGuyeO7cuQoPD1dAQIDmzJlzxURmRESEbXHTNWnSRG3atNGzzz6rMWPGaOXKlVqwYIEnIf/dd9/ZHjM8PFzdunVTWFhYhvfwihUrNGTIEH3//fe2x5SUYUr5xa+zMcax85fL+e233zRjxgy99957XouZHbZv367p06dr8eLFtg06ysqbb76pmJgY1a1bN8vv8hwx+8wgW2zatMkMGjTI1KlTx4SGhppevXqZ5557zlSuXNnMnz/ftjgtWrQw33//vW3tXY/Y2FgzatQo07BhQ1O5cmXTo0cPs2bNGtvjNGrUyKxatcoYY0xoaKg5cOCAMcaYefPmmUaNGtke72K1a9c2v/76qzHGmN69e5uOHTsaY4zZsWOHqV69uiMx77//fs/xhoeHm+3btxtjjHn77bdNVFSUbXGaNm1qzpw5k2GZ2+22rf1r0bhxY7NkyZJMyxctWmQeeeQRR2JWqlTJ/Pnnn460fTmVK1f2vG8vfg/v3r3bVKlSxdHYzz//vBk1alSm2O+++65p1qyZY3ETEhLM9OnTTf/+/c3gwYPNzJkzTXx8vGPx0qWkpJijR4+aQ4cOmUOHDpm//vrL7N2718ydO9fx2N704IMPmsWLFxtjjAkLCzN79uwxLpfLdOrUyQwaNMiRmBe/fy4WGxtrqlat6khMYy58fvbt2+dY+xf766+/PP3gX3/9dcUfJ8XHx5tZs2aZNm3amIoVK5qWLVuaWbNmOfIZurh/evHFF03fvn2NMReO/95777U9Xrp77703y79rbGysqVy5smNx03nzNc5u3jpfM8aY//73v6Zjx47mp59+MqGhoWbFihXms88+M9WrVzfLly93JOaDDz5o/vjjD2NMxn5q+/btpkaNGo7ENMaYdu3amQ4dOpgTJ06YmTNnmpo1a5qjR4+aUaNGmZYtWzoWt3fv3uaee+4xERERpnv37ubNN9/M8GO3evXqmd9//938/fff5p577jH/+9//jDHGrFy50jRo0MD2eOlCQ0PN/v37Pb+n/10PHDjgaB9RpUoVs3XrVsfa9yUtW7Y0n3zyiTEm42s8ZcoUEx4eno17Zr9KlSqZw4cPG2MuXEe///77xhhjDh065Nh3XeXKlc3BgweNMZnfw5UqVXIkpjHGrFu37oo/Tjt37pz56quvzJNPPmlCQkJMaGioo/GSkpLM3LlzzciRI83p06fNunXrzMmTJx2NaYwxycnJZvbs2aZFixYmJCTEVKhQwXTt2tXRmNWqVTMxMTGOxsjKnj17TExMjFm+fLnZu3evo7GYWu5FR44c0fz58zV//nzFxsaqSpUq6ty5sx577DHPtO+xY8dq6NChnmml/1a7du00YMAAHTx4UHfddZdndEw6bxTULVWqlLp3767OnTvrk08+0fjx4xUTE6Pg4GBFRkbqueees6U2U8uWLTVgwADP0Oa9e/fqxx9/1JgxY9S2bdt/3f6VJCYmKjg4WJL0v//9Ty+88IIkKW/evFnWJ7VDQkKCZ4pmmTJltGPHDoWEhKhNmza2jsbcvn27UlNTMyy77777NH/+fEenRF3s+PHjqlChQqbllStX1uHDhx2JWapUKZ06dcqRti/n3nvvVUxMjDp27Jhh+WeffZbl8dtp69at6tevX6blzzzzjGbMmOFIzCNHjqhNmzY6efKkSpcurbS0NM2aNUsTJ07UV1995VhN0KuNBHKyptapU6cUGxvrmepiLppKeemIMzucOXNGoaGhkqS7775b27Zt01133aWOHTuqW7duevvtt22PWaBAAR04cCBT/3D06FHbavdm5b777tOWLVtUsmRJx2Kku3hEthOjs69VgQIF1KJFCzVs2FBff/21Jk6cqL59+2ro0KFq3ry5unXrZltZmbx588rlcsnlcmnDhg0aOnSopAvTdZ0cuXfbbbdp3759mf6u+/btczRuOm++xun1G/fu3at27dp5vX6jt87XJGnnzp36+uuvVb58eVWoUEH58uVTZGSk8uXLp6lTp6px48a2xLlYQkKC8ubNm+W6S89z7PTbb7/p66+/VlBQkH788UfVq1dPxYsX13//+199+umnjsU9cOCA7rvvPknS33//7VicdOHh4erVq5fy5s2rEiVK6P7771dMTIwGDRqk//73v47FLViwoI4dO6Y777wzw/I///zT0Wn1pUuXVmJiomPt/1Mul0ubN29W9erVbW97586dGj58eKblDz/8sD788EPb413su+++y7I8zqZNmxz5/AQFBen48ePKnTu3tm7dqu7du0u6UH6paNGitseTLpxHbN68Wf/3f/+XYfnq1asdvda6//77Pb+7XK5MeQKn7NixQ9OnT9eiRYuUmJioW2+9VZ07d1br1q0di3lpaZEWLVp4Sot8+ulJCwrMAAAgAElEQVSnjpRV2bt3r2bMmKH58+fr7NmzsixLzZs318svv5zpb203Pz8/x68dL+ZyudSrV68MJassy1KDBg30wQcfOPLeIpHpRQ0bNlRQUJCeeOIJjRs3LsvpSRUqVPA8HMEO3bp1kyQNGTIk0zpvDRnftGmT5s2bp5iYGLlcLoWFhalZs2Y6duyYxowZoy1btthS+69Dhw6Kj49XVFSUzp8/r44dO8rf31+tWrXKlBiyW5kyZbRq1SoFBwfryJEjqlu3rqQLdVGdmoYWHBysQ4cOKTg4WKVKldKOHTskXbjYPHv2rCMx0xkvV6QoXbq0li9frvbt22dYvmrVKse+4KOiojRo0CB17949y5sAdtWNuViPHj30wgsv6LffflNqaqomTJig3bt3a9u2bZo6dart8S6WO3dunTt3LtPyw4cPX/bC79969913FRwcrK+//tpzoX7ixAl17dpV77//vkaOHOlI3FGjRqlSpUqKjIxU586dNWLECB0+fFgffviho1MtFi9erN69e+v8+fOeqcjpU3luv/12RxKZRYsW1cmTJ/Wf//xHd955p3bt2iVJKlKkiE6cOGF7PEl65JFH1L9/fw0YMECVK1eWZVnasmWLBg4c6OjDWZo0aaKBAwdq69atWX5mnUpQnzp1SsOHD9fWrVuVnJycqX90qh6Uy+XSihUrNG/ePP3vf/9TsWLF1LZtW8/365AhQ9SlSxd98skntsSrWbOm3n//fU9ioE6dOtq+fbsGDx6smjVr2hIjK48//rgGDBigfv36eZIyGzdu1MCBA/Xoo486Flfy7mucHRdZl/LW+Zok5cqVy5MALlWqlHbt2qXatWurVq1ajk0trFGjhr788ssMN3BSUlL00UcfOfrAqvQHZKWlpennn39Wnz59JF1IrDp5c8fJcgRZ6dmzp0qUKKGDBw/q2WefVa5cuXTy5Ek9/fTTeu211xyL+8QTT2jIkCEaMmSILMtSQkKCVq9erUGDBjk6rb5fv37q37+/IiMj9X//93+Z6ug6NVhk27Ztevvtt7Vz507PTdGLOXFtl13J4tGjR+vjjz/Wbbfdpr///lvFixfXiRMnlJaWpvDwcEdiZkdCvn379howYICOHTsmY4zWrl2rGTNm6PPPP/9HJYqux/Tp0zV58mQdPXpUS5cu1ZQpU1SsWDHba4G6XC7FxMRo+vTp2rx5s3LlyqUHHnhAP/30kz755BPH6qene/fdd1W2bFktXLhQDzzwgCTpvffeU48ePTR8+HDbSoukpqZq2bJlmjFjhtavX6/cuXOrXr16atKkiV5//XW1bdvW8SSmdOEmw9y5cz25IKeNHj1amzdv1oQJE1SjRg2lpaVp/fr1Gjx4sMaOHauePXvaHpNEpheNHTtWDRo0uOLd7EaNGtlauD47nyI9fvx4zZ8/XwcOHFClSpXUvXt3Pf744xlGLuTKlUvvvPOOLfF++eUXdenSRa+88op2794tY4zuuusurzzk6LXXXlOXLl2UkpKixx9/XKVKldKwYcP05Zdf6qOPPnIk5qOPPqrXX39dw4cPV61atdStWzeFhoZqxYoVXhmR5E0vvviiXn/9dW3fvl1VqlTxJEYWL16swYMHOxIzfVTrq6++6rW6MdWqVdPMmTMVHR2tkiVL6vfff1e5cuXUp08fValSxfZ4F2vcuLFGjhyp0aNHe5bt2bNHQ4YMUf369R2JuWbNGn3yyScZRhsVLVpUb7zxhqMP58qOkUCSNHHiRD3++OPq0KGD5yETx48f14ABA9SlSxdHYtarV0/9+vXTsGHDVK1aNQ0ZMkRhYWGKiYlxbMRrz549dfDgQbVr1y7DZycsLEyvv/66IzElqW/fvpIu1NS9lFOFxtPj/v7773rssce89lCN3r17a9myZXK5XGrYsKEmTJighx56yPN633nnnerYsaN69+5tW8x+/fqpX79+2rlzp95//30VKFBA8+fPl7+/v6MXWq+88op27dqljh07eo7PGKN69eo5cmKcrk+fPlq6dKnXXmNvXWRlxdvna9KF2mzLly9X27ZtVbp0aW3cuFHPP/+8jh49aluMS73xxht69tln9csvvyglJUX9+/fX3r17FR8fry+++MKxuKGhoZo4caKKFi2qpKQk1a1bV8eOHdOoUaM8I+adkpiYqAULFmjnzp3y9/dXuXLlMswEs9OCBQvUsmXLDDeRIiMjlZiYqM8//9yx2VHdunXT0aNHPXUaIyIiZIxR/fr1PaPpnPDnn39q9+7dnsT0xZwcLDJs2DD5+/urX79+Gjx4sN58800dOHBAX375ZZajJu2QXcni+fPnq2/fvnr22WdVv359ffXVV8qXL586derk2ECGnj17Kjg4WAcOHPBaQr558+aeAQzJycl65513FBQUpO7du+uZZ55xJKYkLVy4UCNHjtTzzz+vKVOmSLowOGfEiBHKkyePbefi7777rubOnav4+HhVr15d/fv31yOPPKJbbrlFFStW9MoDC3/++WdNmjQpw+CMwoULKyoq6h89mPNq6tevr3PnzqlWrVoaNmyYGjdu7Olvo6KibItzNYUKFVJ0dLRWr16d5c19uwduLFq0SIMHD1a9evU8yxo3bqxcuXJpwIABzpyvOTpxHZ76a9fy46T4+HizadMms23bNq/Vdapdu7YZNmzYFesM/vHHH+aLL76wJV7NmjWztVbNqVOnPHUqjTHm999/N7t373Ys3vnz583gwYPNggULjDHG9OvXz5QvX95Ur17dU5fIDuXLlzcnTpzIsOxyNfCctGTJEtOyZUsTGhpqatSoYVq1amW+++47x+J5q25M3bp1zdGjR40xxowdO9YkJiba1vY/ER8fb1q2bGlCQkI876Py5cubpk2bmtOnTzsS8/777ze7du3KtHzHjh2O1skJDQ311C7s3bu3mTZtmjHmQq0/J+ukVapUyezZs8cYY8xzzz1nVq9ebYwxZunSpSYiIsKRmHFxceaVV14xX3zxhXG73aZDhw6mfPnypmLFimbRokWOxEy3d+9es2TJErNixQoTGxvraKzsFBoaan755RevxmzatKn57LPPMtUvvtiePXvMypUrbYt56NAhk5aWlmHZ+fPnTUpKitm0aZNtcS5n9+7dJiYmxixevNjR79Z03n6Ns6t+ozHeP18z5kLdxHvuucd8+eWX5vDhw+bee+81HTp0MHXr1jVdunSxLc6ljh07Zj744APz0ksvmRdffNG89957ntp0Ttm3b5+JiIgw1atXN19++aUxxpiBAweaBg0aeL4TnHD48GHTsGFDU6VKFdO0aVPzxBNPmMqVK5sGDRqYI0eO2BLj5MmTnuuYkJAQs3Xr1kzXNytWrHC0jm66ffv2mSVLlpjFixd7pcZ53bp1zTvvvGN2797t1frIoaGhnj736aefNuvXrzfGGPPJJ5+Ytm3bOhLT5XKZHj16mPLly5vy5ct7zhU7duxokpOTHYlpjDEVK1b0fD47duzoqZe/fv168/DDDzsSc+DAgZ6aq94yf/58z3fNyZMnM113OaVp06Zmzpw5xpiM3ztz5swxYWFhtsUpX768adKkiVm5cmWm84gKFSp45fMaGhrqqdl46XesnfXb0/vYfv36mWXLlmX4fHjrWI0xpk2bNlf8sVtoaGiW5/qxsbGO9f+MyHRYw4YNr/i0tYs5cefOGKPhw4friy++UGpqqowxCggIUMuWLdW7d+9r3rfr8cMPP8jf/8pvsQoVKthWvyEoKEjx8fG2tHU9ihQpoiJFinj+7fQIuoCAgAx3gfv3769u3bqpYMGCttWwki7cVb70feLk++ZyHn30UcenEV7MW3VjTp8+rWPHjql48eL66KOP1Lp1a8emcl9JgQIFNGPGDK1du1bbtm2T2+3W3XffrTp16jh2p7RatWoaP368hg8frty5c0u6MM1vwoQJqlq1qiMxpewZCSRJefLk8RxnqVKl9Oeff6pu3bqqVKmS9u/f70jMggULavz48Z5/T5o0Sdu2bVPRokV12223ORIzXenSpVW6dGlHY2Tl8OHD2rNnj2rUqKGEhAQFBQU5Gi9v3rwqVqyYozEuVbx4cT3wwANXHAF611136a677rItZqNGjbRmzZoMI6gDAgK0b98+RUZGatOmTbbFOnz4sIKDg2VZlqcOct68eTN8r6Yvz507t4oUKXLV841/au7cuVfd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KCoqwq5du7Bv3z7cu3cPBgYGsLKywpQpU9CuXTvV/wURERERkQK3lhMRERGRaPr37487d+4gISEBhoaG/+jXvnz5EiNGjEBaWhqGDRuGJk2a4MGDB4iIiECFChUQGRmpaBDk6uqK27dv4+3bt7Czs0OHDh3w6NEjhIaGokKFCjh79iyMjY0BvEtkZmVloXLlypg8eTKysrLQv39/NGrUCLNmzcLhw4fh5OSETp064eXLl4iKikJaWhpWr16N3r17q/zviIiIiIje4YpMIiIiIhJNWloaqlWrVmoSMzMzs8SYrq4uTExMAABr167Fw4cP8Z///AfW1taKc1xcXODi4gJfX19s27ZNMf7ixQt4enpCJpMpxgwNDbFu3TrExcXh22+/VYzn5uZi7dq1sLOzU4zFxcXh8OHDmDNnDiZNmqQYHzduHIYOHYrvv/8ednZ2qFSp0v/4t0FEREREH8NEJhERERGJpqioCEVFRaUe69KlS4mxunXr4vTp05DL5Thy5AgaNWoEqVSqlPSsXr06rKyscOHCBeTk5KBy5cqKYwMGDFD6/Vq3bg0AePbsmdK4gYEBunXrpjR2+PBhAICTk1OJJKujoyO2bNmC+Ph4dO/e/VN/bCIiIiL6HzCRSURERESiMTc3x71795Cfn1+i0U9ISIjS+zlz5iheZ2Vl4cWLF3jx4kWpCc/30tPT0bhxY8X7GjVqKB1/P+ffk6nVqlUrUbPz3r17AIBevXp9cL7Hjx9/8BgRERERfRkmMomIiIhINB06dMCff/6JCxcu4JtvvlE61rVrV6X3FSpUULx++/YtAKBdu3aYNm3aB39/c3Nzpfc6OjqfFVdpjYfevn2LypUrY+PGjR/8dQ0bNvys35+IiIiI/jkmMomIiIhINEOHDkVkZCS2bduG7t27Q1dX97N+nampKQwNDfHq1asSCU8AuHDhAnR0dJSSn1/qq6++wr1792BpaQlTU1OlY3/88QeePn3K+phEREREavR5j6SJiIiIiNSgTZs2mDBhAq5cuQIvLy/k5uaWOCc/Px/btm1DRkaGYkxXVxe9evXCnTt3FLUr30tOToa7uzv8/PxKXVn5v3JycgLwrslQcdnZ2fDw8MDUqVORl5ensvmIiIiISBlXZBIRERGRqDw9PaGrq4vg4GCcP38eTk5OaNq0KXR0dJCSkoJjx47h6dOn+Oqrr7Bw4UKlXxcfHw9PT0+cP38ebdu2xZMnTxAREQFdXV34+PioNE4XFxccPXoUkZGRePjwIezt7VFYWIi9e/fi/v37mDNnDmrVqqXSOYmIiIjo/2Mik4iIiIhEpaenhzlz5qB///6IiorCxYsXcfjwYeTl5cHMzAzt27eHo6MjHBwclFZY1qpVC/v378fmzZtx+vRpxMTEoFq1aujYsSOmTJmCFi1aqDROXV1dbNmyBTt37kR0dDRWrVqFSpUqoXHjxtiwYQMcHR1VOh8RERERKZPI5XK52EEQERERERERERERfQxrZBIREREREREREZHGYyKTiIiIiIiIiIiINB4TmURERERERERERKTxmMgkIiIiIiIiIiIijcdEJhEREREREREREWk8JjKJiIiIiIiIiIhI4zGRSURERERERERERBqPiUwiIiIiIiIiIiLSeExkEhERERERERERkcZjIpOIiIiIiIiIiIg0HhOZREREREREREREpPGYyCQiIiIiIiIiIiKN9/8AppI8IhQvipUAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 1600x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "\n",
    "# Set style and context\n",
    "sns.set_style('whitegrid')\n",
    "sns.set_context('notebook')\n",
    "\n",
    "# Prepare the data\n",
    "genre_counts = pd.Series(all_genres).value_counts()\n",
    "\n",
    "# Create the plot\n",
    "plt.figure(figsize=(16, 6))\n",
    "\n",
    "colors = sns.color_palette('pastel')[0:len(genre_counts)]\n",
    "sns.barplot(x=genre_counts.index, y=genre_counts.values, palette=colors)\n",
    "\n",
    "plt.title('Distribution of Genres', fontsize=20)\n",
    "plt.xlabel('Genre', fontsize=14)\n",
    "plt.ylabel('Count', fontsize=14)\n",
    "plt.xticks(rotation=90)\n",
    "\n",
    "# Show and save the plot\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "9d231d56",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "42 ['Action', 'Adventure', 'Cars', 'Comedy', 'Dementia', 'Demons', 'Drama', 'Ecchi', 'Fantasy', 'Game', 'Harem', 'Historical', 'Horror', 'Josei', 'Kids', 'Magic', 'Martial Arts', 'Mecha', 'Military', 'Music', 'Mystery', 'Parody', 'Police', 'Psychological', 'Romance', 'Samurai', 'School', 'Sci-Fi', 'Seinen', 'Shoujo', 'Shoujo Ai', 'Shounen', 'Shounen Ai', 'Slice of Life', 'Space', 'Sports', 'Super Power', 'Supernatural', 'Thriller', 'Unknown', 'Vampire', 'Yaoi']\n"
     ]
    }
   ],
   "source": [
    "unique_labels = sorted(list(set(reduce(lambda y, z: y + z, pre_merged_anime['Genres'].map(lambda x: x.split(', '))))))\n",
    "\n",
    "print(len(unique_labels), unique_labels)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "fa97c096",
   "metadata": {},
   "outputs": [],
   "source": [
    "id2label = {idx:label for idx, label in enumerate(unique_labels)}\n",
    "label2id = {label:idx for idx, label in enumerate(unique_labels)}\n",
    "     "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "0ca911f9",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import torch\n",
    "TEACHER_MODEL = 'bert-large-uncased'\n",
    "\n",
    "tokenizer = AutoTokenizer.from_pretrained(TEACHER_MODEL)\n",
    "\n",
    "def preprocess_data(examples, text_col):\n",
    "    one_hot_encoded_matrix = []\n",
    "    text = examples[text_col]\n",
    "    genres = examples[\"Genres\"]\n",
    "    for genre in genres:\n",
    "        g = genre.split(', ')\n",
    "        one_hot_encoded_row = [1 if label in g else 0 for label in unique_labels]\n",
    "        one_hot_encoded_matrix.append(one_hot_encoded_row)\n",
    "\n",
    "    # Convert the one_hot_encoded_matrix to a LongTensor\n",
    "    one_hot_encoded_matrix = [torch.tensor(o, dtype=torch.float32) for o in one_hot_encoded_matrix]\n",
    "\n",
    "    # Encode the text\n",
    "    encoding = tokenizer(text, truncation=True, max_length=256)\n",
    "    \n",
    "    # Add labels\n",
    "    encoding[\"labels\"] = one_hot_encoded_matrix\n",
    "\n",
    "    return encoding\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "90ef5196",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "8c00dd63",
   "metadata": {},
   "outputs": [],
   "source": [
    "from datasets import Dataset\n",
    "anime_with_synopsis_dataset = Dataset.from_pandas(pre_merged_anime[['synopsis', 'Genres', 'generated_description']])\n",
    "\n",
    "anime_with_synopsis_dataset = anime_with_synopsis_dataset.train_test_split(test_size=.2, seed=42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "b3d750f3",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Map:   0%|          | 0/12964 [00:00<?, ? examples/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Map:   0%|          | 0/3242 [00:00<?, ? examples/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "DatasetDict({\n",
       "    train: Dataset({\n",
       "        features: ['input_ids', 'token_type_ids', 'attention_mask', 'labels'],\n",
       "        num_rows: 12964\n",
       "    })\n",
       "    test: Dataset({\n",
       "        features: ['input_ids', 'token_type_ids', 'attention_mask', 'labels'],\n",
       "        num_rows: 3242\n",
       "    })\n",
       "})"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "description_encoded_dataset = anime_with_synopsis_dataset.map(\n",
    "    lambda x: preprocess_data(x, 'generated_description'),\n",
    "    batched=True, batch_size=128, remove_columns=['synopsis', 'Genres', 'generated_description']\n",
    ")\n",
    "\n",
    "description_encoded_dataset\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "2716947f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'input_ids': [101,\n",
       "  14100,\n",
       "  6172,\n",
       "  23289,\n",
       "  2003,\n",
       "  1037,\n",
       "  2694,\n",
       "  2265,\n",
       "  1012,\n",
       "  19962,\n",
       "  22599,\n",
       "  1024,\n",
       "  5595,\n",
       "  2086,\n",
       "  3283,\n",
       "  1010,\n",
       "  3287,\n",
       "  6767,\n",
       "  16136,\n",
       "  6386,\n",
       "  2124,\n",
       "  2004,\n",
       "  2601,\n",
       "  7545,\n",
       "  2716,\n",
       "  2055,\n",
       "  1996,\n",
       "  1000,\n",
       "  2058,\n",
       "  23663,\n",
       "  1010,\n",
       "  1000,\n",
       "  1037,\n",
       "  10250,\n",
       "  10631,\n",
       "  24826,\n",
       "  2015,\n",
       "  2724,\n",
       "  2008,\n",
       "  3908,\n",
       "  2028,\n",
       "  1011,\n",
       "  7891,\n",
       "  1997,\n",
       "  1996,\n",
       "  2088,\n",
       "  1012,\n",
       "  1999,\n",
       "  1996,\n",
       "  2556,\n",
       "  2154,\n",
       "  1010,\n",
       "  1996,\n",
       "  11265,\n",
       "  14971,\n",
       "  6313,\n",
       "  3029,\n",
       "  5698,\n",
       "  4003,\n",
       "  11014,\n",
       "  1996,\n",
       "  2601,\n",
       "  7545,\n",
       "  1005,\n",
       "  2373,\n",
       "  2005,\n",
       "  2037,\n",
       "  2035,\n",
       "  2021,\n",
       "  7036,\n",
       "  11174,\n",
       "  1012,\n",
       "  5292,\n",
       "  6820,\n",
       "  8294,\n",
       "  1010,\n",
       "  1037,\n",
       "  4690,\n",
       "  1011,\n",
       "  26974,\n",
       "  3165,\n",
       "  1011,\n",
       "  10681,\n",
       "  10563,\n",
       "  1010,\n",
       "  22490,\n",
       "  2015,\n",
       "  1996,\n",
       "  2516,\n",
       "  1997,\n",
       "  23289,\n",
       "  3040,\n",
       "  1024,\n",
       "  1996,\n",
       "  2711,\n",
       "  2040,\n",
       "  15536,\n",
       "  14273,\n",
       "  2015,\n",
       "  1996,\n",
       "  2373,\n",
       "  1997,\n",
       "  1996,\n",
       "  8987,\n",
       "  23289,\n",
       "  6386,\n",
       "  1010,\n",
       "  10471,\n",
       "  5214,\n",
       "  1997,\n",
       "  9846,\n",
       "  1996,\n",
       "  2601,\n",
       "  7545,\n",
       "  1012,\n",
       "  2174,\n",
       "  1010,\n",
       "  1996,\n",
       "  2116,\n",
       "  23289,\n",
       "  6386,\n",
       "  2020,\n",
       "  7932,\n",
       "  2408,\n",
       "  1996,\n",
       "  7595,\n",
       "  2004,\n",
       "  1037,\n",
       "  2765,\n",
       "  1997,\n",
       "  1996,\n",
       "  2058,\n",
       "  23663,\n",
       "  1010,\n",
       "  4352,\n",
       "  5698,\n",
       "  4003,\n",
       "  2000,\n",
       "  3613,\n",
       "  2037,\n",
       "  15451,\n",
       "  18098,\n",
       "  28804,\n",
       "  2229,\n",
       "  1012,\n",
       "  14100,\n",
       "  6172,\n",
       "  23289,\n",
       "  4076,\n",
       "  5292,\n",
       "  6820,\n",
       "  1010,\n",
       "  2010,\n",
       "  4326,\n",
       "  3899,\n",
       "  20228,\n",
       "  5657,\n",
       "  1010,\n",
       "  1996,\n",
       "  15443,\n",
       "  9081,\n",
       "  10707,\n",
       "  1010,\n",
       "  1998,\n",
       "  1996,\n",
       "  14429,\n",
       "  12383,\n",
       "  21137,\n",
       "  1010,\n",
       "  2004,\n",
       "  2027,\n",
       "  28866,\n",
       "  2006,\n",
       "  1037,\n",
       "  2307,\n",
       "  4990,\n",
       "  2008,\n",
       "  2097,\n",
       "  2202,\n",
       "  2068,\n",
       "  2105,\n",
       "  1996,\n",
       "  6565,\n",
       "  2088,\n",
       "  1010,\n",
       "  6575,\n",
       "  2005,\n",
       "  1996,\n",
       "  23289,\n",
       "  6386,\n",
       "  2008,\n",
       "  2097,\n",
       "  2633,\n",
       "  2203,\n",
       "  5698,\n",
       "  4003,\n",
       "  1005,\n",
       "  1055,\n",
       "  21321,\n",
       "  1012,\n",
       "  2009,\n",
       "  2001,\n",
       "  2550,\n",
       "  2011,\n",
       "  29584,\n",
       "  1010,\n",
       "  12849,\n",
       "  7847,\n",
       "  7377,\n",
       "  1998,\n",
       "  2009,\n",
       "  2003,\n",
       "  2013,\n",
       "  2996,\n",
       "  9266,\n",
       "  2078,\n",
       "  2996,\n",
       "  1012,\n",
       "  2049,\n",
       "  3120,\n",
       "  2003,\n",
       "  8952,\n",
       "  1012,\n",
       "  2009,\n",
       "  5885,\n",
       "  1999,\n",
       "  2991,\n",
       "  2541,\n",
       "  1012,\n",
       "  102],\n",
       " 'token_type_ids': [0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0,\n",
       "  0],\n",
       " 'attention_mask': [1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1],\n",
       " 'labels': [0.0,\n",
       "  1.0,\n",
       "  0.0,\n",
       "  1.0,\n",
       "  0.0,\n",
       "  0.0,\n",
       "  0.0,\n",
       "  0.0,\n",
       "  1.0,\n",
       "  0.0,\n",
       "  0.0,\n",
       "  0.0,\n",
       "  0.0,\n",
       "  0.0,\n",
       "  0.0,\n",
       "  0.0,\n",
       "  0.0,\n",
       "  0.0,\n",
       "  0.0,\n",
       "  0.0,\n",
       "  0.0,\n",
       "  0.0,\n",
       "  0.0,\n",
       "  0.0,\n",
       "  1.0,\n",
       "  0.0,\n",
       "  0.0,\n",
       "  0.0,\n",
       "  0.0,\n",
       "  0.0,\n",
       "  0.0,\n",
       "  1.0,\n",
       "  0.0,\n",
       "  0.0,\n",
       "  0.0,\n",
       "  0.0,\n",
       "  0.0,\n",
       "  0.0,\n",
       "  0.0,\n",
       "  0.0,\n",
       "  0.0,\n",
       "  0.0]}"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "description_encoded_dataset['train'][0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "9beb057f",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Import the necessary libraries\n",
    "from sklearn.metrics import f1_score, roc_auc_score, accuracy_score\n",
    "from transformers import EvalPrediction\n",
    "import torch\n",
    "import numpy as np\n",
    "from sklearn.metrics import f1_score, roc_auc_score, accuracy_score, jaccard_score\n",
    "\n",
    "# Define a function to compute several multi-label metrics\n",
    "def multi_label_metrics(predictions, labels, threshold=0.5):\n",
    "    # Initialize the sigmoid function which we'll use to transform our raw prediction values\n",
    "    sigmoid = torch.nn.Sigmoid()\n",
    "    \n",
    "    # Apply sigmoid function to our predictions\n",
    "    probs = sigmoid(torch.Tensor(predictions))\n",
    "    \n",
    "    # Create a binary prediction array based on our threshold\n",
    "    y_pred = np.zeros(probs.shape)\n",
    "    y_pred[np.where(probs >= threshold)] = 1\n",
    "    \n",
    "    # Use actual labels as y_true\n",
    "    y_true = labels\n",
    "    \n",
    "    # Compute F1 score, ROC AUC score, Accuracy, and Jaccard score\n",
    "    f1_micro_average = f1_score(y_true=y_true, y_pred=y_pred, average='micro')\n",
    "    roc_auc = roc_auc_score(y_true, y_pred, average='micro')\n",
    "    accuracy = accuracy_score(y_true, y_pred)\n",
    "    jaccard = jaccard_score(y_true, y_pred, average='micro')\n",
    "    \n",
    "    # Package the scores into a dictionary and return it\n",
    "    metrics = {'f1': f1_micro_average,\n",
    "               'roc_auc': roc_auc,\n",
    "               'accuracy': accuracy,\n",
    "               'jaccard': jaccard}\n",
    "    return metrics\n",
    "\n",
    "# Define a function to compute metrics for predictions\n",
    "def compute_metrics(p: EvalPrediction):\n",
    "    # Extract the prediction values from the EvalPrediction object\n",
    "    preds = p.predictions[0] if isinstance(p.predictions, tuple) else p.predictions\n",
    "    \n",
    "    # Compute the multi-label metrics for the predictions and actual labels\n",
    "    result = multi_label_metrics(predictions=preds, labels=p.label_ids)\n",
    "    \n",
    "    # Return the results\n",
    "    return result\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "082ebc33",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n",
      "To disable this warning, you can either:\n",
      "\t- Avoid using `tokenizers` before the fork if possible\n",
      "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n",
      "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n",
      "To disable this warning, you can either:\n",
      "\t- Avoid using `tokenizers` before the fork if possible\n",
      "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n"
     ]
    }
   ],
   "source": [
    "from transformers import Trainer, TrainingArguments, DataCollatorWithPadding\n",
    "\n",
    "data_collator = DataCollatorWithPadding(tokenizer=tokenizer)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "249f8159",
   "metadata": {},
   "source": [
    "# Train with normal BERT"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "6dd021da",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "386f8ec2418142dab19e054ad3680f0b",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Downloading model.safetensors:   0%|          | 0.00/1.34G [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Some weights of the model checkpoint at bert-large-uncased were not used when initializing BertForSequenceClassification: ['cls.predictions.bias', 'cls.predictions.transform.LayerNorm.weight', 'cls.seq_relationship.weight', 'cls.predictions.transform.dense.weight', 'cls.predictions.transform.LayerNorm.bias', 'cls.predictions.transform.dense.bias', 'cls.seq_relationship.bias']\n",
      "- This IS expected if you are initializing BertForSequenceClassification from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).\n",
      "- This IS NOT expected if you are initializing BertForSequenceClassification from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).\n",
      "Some weights of BertForSequenceClassification were not initialized from the model checkpoint at bert-large-uncased and are newly initialized: ['classifier.bias', 'classifier.weight']\n",
      "You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n"
     ]
    }
   ],
   "source": [
    "model = AutoModelForSequenceClassification.from_pretrained(\n",
    "    TEACHER_MODEL,\n",
    "    problem_type=\"multi_label_classification\", \n",
    "    num_labels=len(unique_labels),\n",
    "    id2label=id2label,\n",
    "    label2id=label2id\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "41d21774",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "You're using a BertTokenizerFast tokenizer. Please note that with a fast tokenizer, using the `__call__` method is faster than using a method to encode the text followed by a call to the `pad` method to get a padded encoding.\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\nn\\parallel\\_functions.py:68: UserWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.\n",
      "  warnings.warn('Was asked to gather along dimension 0, but all '\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      \n",
       "      <progress value='52' max='26' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      [26/26 32:18]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\u001b[34m\u001b[1mwandb\u001b[0m: Currently logged in as: \u001b[33mprofoz\u001b[0m. Use \u001b[1m`wandb login --relogin`\u001b[0m to force relogin\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "wandb version 0.15.3 is available!  To upgrade, please run:\n",
       " $ pip install wandb --upgrade"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Tracking run with wandb version 0.15.0"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Run data is saved locally in <code>C:\\Users\\sinan\\Downloads\\wandb\\run-20230523_181413-eqq5vhoa</code>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Syncing run <strong><a href='https://wandb.ai/profoz/huggingface/runs/eqq5vhoa' target=\"_blank\">scarlet-cosmos-148</a></strong> to <a href='https://wandb.ai/profoz/huggingface' target=\"_blank\">Weights & Biases</a> (<a href='https://wandb.me/run' target=\"_blank\">docs</a>)<br/>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       " View project at <a href='https://wandb.ai/profoz/huggingface' target=\"_blank\">https://wandb.ai/profoz/huggingface</a>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       " View run at <a href='https://wandb.ai/profoz/huggingface/runs/eqq5vhoa' target=\"_blank\">https://wandb.ai/profoz/huggingface/runs/eqq5vhoa</a>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "{'eval_loss': 0.7340084314346313,\n",
       " 'eval_f1': 0.10238879736408567,\n",
       " 'eval_roc_auc': 0.45753649576323013,\n",
       " 'eval_accuracy': 0.0,\n",
       " 'eval_jaccard': 0.05395667838694274,\n",
       " 'eval_runtime': 86.0092,\n",
       " 'eval_samples_per_second': 37.694,\n",
       " 'eval_steps_per_second': 0.302}"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from transformers import TrainingArguments, Trainer\n",
    "\n",
    "args = TrainingArguments(\n",
    "    f\"genre-prediction-bert\",\n",
    "    evaluation_strategy = \"epoch\",\n",
    "    save_strategy = \"epoch\",\n",
    "    per_device_train_batch_size=4,\n",
    "    gradient_accumulation_steps=16,\n",
    "    per_device_eval_batch_size=64,\n",
    "    num_train_epochs=10,\n",
    "    logging_steps=50,\n",
    "    load_best_model_at_end=True,\n",
    "    fp16=True\n",
    ")\n",
    "\n",
    "trainer = Trainer(\n",
    "    model,\n",
    "    args,\n",
    "    train_dataset=description_encoded_dataset[\"train\"],\n",
    "    eval_dataset=description_encoded_dataset[\"test\"],\n",
    "    tokenizer=tokenizer,\n",
    "    data_collator=data_collator,\n",
    "    compute_metrics=compute_metrics\n",
    ")\n",
    "\n",
    "trainer.evaluate()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "0757706c",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\transformers\\optimization.py:391: FutureWarning: This implementation of AdamW is deprecated and will be removed in a future version. Use the PyTorch implementation torch.optim.AdamW instead, or set `no_deprecation_warning=True` to disable this warning\n",
      "  warnings.warn(\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\nn\\parallel\\_functions.py:68: UserWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.\n",
      "  warnings.warn('Was asked to gather along dimension 0, but all '\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\cuda\\nccl.py:15: UserWarning: PyTorch is not compiled with NCCL support\n",
      "  warnings.warn('PyTorch is not compiled with NCCL support')\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      \n",
       "      <progress value='1000' max='1000' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      [1000/1000 5:08:01, Epoch 9/10]\n",
       "    </div>\n",
       "    <table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       " <tr style=\"text-align: left;\">\n",
       "      <th>Epoch</th>\n",
       "      <th>Training Loss</th>\n",
       "      <th>Validation Loss</th>\n",
       "      <th>F1</th>\n",
       "      <th>Roc Auc</th>\n",
       "      <th>Accuracy</th>\n",
       "      <th>Jaccard</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>0.210000</td>\n",
       "      <td>0.196911</td>\n",
       "      <td>0.261087</td>\n",
       "      <td>0.577813</td>\n",
       "      <td>0.056755</td>\n",
       "      <td>0.150144</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>0.172100</td>\n",
       "      <td>0.165546</td>\n",
       "      <td>0.454545</td>\n",
       "      <td>0.661204</td>\n",
       "      <td>0.121838</td>\n",
       "      <td>0.294118</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>0.147500</td>\n",
       "      <td>0.150766</td>\n",
       "      <td>0.539274</td>\n",
       "      <td>0.709597</td>\n",
       "      <td>0.144355</td>\n",
       "      <td>0.369182</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>0.130600</td>\n",
       "      <td>0.142275</td>\n",
       "      <td>0.551376</td>\n",
       "      <td>0.711728</td>\n",
       "      <td>0.156385</td>\n",
       "      <td>0.380621</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>0.116900</td>\n",
       "      <td>0.137746</td>\n",
       "      <td>0.579970</td>\n",
       "      <td>0.733529</td>\n",
       "      <td>0.166564</td>\n",
       "      <td>0.408421</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>5</td>\n",
       "      <td>0.103400</td>\n",
       "      <td>0.134732</td>\n",
       "      <td>0.605386</td>\n",
       "      <td>0.749923</td>\n",
       "      <td>0.184454</td>\n",
       "      <td>0.434089</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>6</td>\n",
       "      <td>0.093700</td>\n",
       "      <td>0.133428</td>\n",
       "      <td>0.614290</td>\n",
       "      <td>0.757610</td>\n",
       "      <td>0.190315</td>\n",
       "      <td>0.443303</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>8</td>\n",
       "      <td>0.086700</td>\n",
       "      <td>0.133145</td>\n",
       "      <td>0.620375</td>\n",
       "      <td>0.762284</td>\n",
       "      <td>0.192474</td>\n",
       "      <td>0.449669</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>8</td>\n",
       "      <td>0.080600</td>\n",
       "      <td>0.132554</td>\n",
       "      <td>0.622715</td>\n",
       "      <td>0.762406</td>\n",
       "      <td>0.201419</td>\n",
       "      <td>0.452132</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>9</td>\n",
       "      <td>0.077300</td>\n",
       "      <td>0.132676</td>\n",
       "      <td>0.626066</td>\n",
       "      <td>0.765166</td>\n",
       "      <td>0.200802</td>\n",
       "      <td>0.455674</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table><p>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\nn\\parallel\\_functions.py:68: UserWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.\n",
      "  warnings.warn('Was asked to gather along dimension 0, but all '\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\cuda\\nccl.py:15: UserWarning: PyTorch is not compiled with NCCL support\n",
      "  warnings.warn('PyTorch is not compiled with NCCL support')\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\nn\\parallel\\_functions.py:68: UserWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.\n",
      "  warnings.warn('Was asked to gather along dimension 0, but all '\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\cuda\\nccl.py:15: UserWarning: PyTorch is not compiled with NCCL support\n",
      "  warnings.warn('PyTorch is not compiled with NCCL support')\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\nn\\parallel\\_functions.py:68: UserWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.\n",
      "  warnings.warn('Was asked to gather along dimension 0, but all '\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\cuda\\nccl.py:15: UserWarning: PyTorch is not compiled with NCCL support\n",
      "  warnings.warn('PyTorch is not compiled with NCCL support')\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\nn\\parallel\\_functions.py:68: UserWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.\n",
      "  warnings.warn('Was asked to gather along dimension 0, but all '\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\cuda\\nccl.py:15: UserWarning: PyTorch is not compiled with NCCL support\n",
      "  warnings.warn('PyTorch is not compiled with NCCL support')\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\nn\\parallel\\_functions.py:68: UserWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.\n",
      "  warnings.warn('Was asked to gather along dimension 0, but all '\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\cuda\\nccl.py:15: UserWarning: PyTorch is not compiled with NCCL support\n",
      "  warnings.warn('PyTorch is not compiled with NCCL support')\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\nn\\parallel\\_functions.py:68: UserWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.\n",
      "  warnings.warn('Was asked to gather along dimension 0, but all '\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\cuda\\nccl.py:15: UserWarning: PyTorch is not compiled with NCCL support\n",
      "  warnings.warn('PyTorch is not compiled with NCCL support')\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\nn\\parallel\\_functions.py:68: UserWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.\n",
      "  warnings.warn('Was asked to gather along dimension 0, but all '\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\cuda\\nccl.py:15: UserWarning: PyTorch is not compiled with NCCL support\n",
      "  warnings.warn('PyTorch is not compiled with NCCL support')\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\nn\\parallel\\_functions.py:68: UserWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.\n",
      "  warnings.warn('Was asked to gather along dimension 0, but all '\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\cuda\\nccl.py:15: UserWarning: PyTorch is not compiled with NCCL support\n",
      "  warnings.warn('PyTorch is not compiled with NCCL support')\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\nn\\parallel\\_functions.py:68: UserWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.\n",
      "  warnings.warn('Was asked to gather along dimension 0, but all '\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\cuda\\nccl.py:15: UserWarning: PyTorch is not compiled with NCCL support\n",
      "  warnings.warn('PyTorch is not compiled with NCCL support')\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "TrainOutput(global_step=1000, training_loss=0.1294983742237091, metrics={'train_runtime': 18498.7014, 'train_samples_per_second': 6.943, 'train_steps_per_second': 0.054, 'total_flos': 5.44381673587915e+16, 'train_loss': 0.1294983742237091, 'epoch': 9.96})"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "trainer.train()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "a0b28568",
   "metadata": {},
   "outputs": [],
   "source": [
    "trainer.save_model()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ef16181a",
   "metadata": {},
   "source": [
    "# Train with Distil BERT (Task-Agnostic Distilation)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "a78bf3e8",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Some weights of the model checkpoint at distilbert-base-uncased were not used when initializing DistilBertForSequenceClassification: ['vocab_layer_norm.weight', 'vocab_transform.weight', 'vocab_projector.bias', 'vocab_transform.bias', 'vocab_projector.weight', 'vocab_layer_norm.bias']\n",
      "- This IS expected if you are initializing DistilBertForSequenceClassification from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).\n",
      "- This IS NOT expected if you are initializing DistilBertForSequenceClassification from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).\n",
      "Some weights of DistilBertForSequenceClassification were not initialized from the model checkpoint at distilbert-base-uncased and are newly initialized: ['classifier.weight', 'classifier.bias', 'pre_classifier.bias', 'pre_classifier.weight']\n",
      "You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n"
     ]
    }
   ],
   "source": [
    "\n",
    "distil_model = AutoModelForSequenceClassification.from_pretrained(\n",
    "    'distilbert-base-uncased',\n",
    "    problem_type=\"multi_label_classification\", \n",
    "    num_labels=len(unique_labels),\n",
    "    id2label=id2label,\n",
    "    label2id=label2id\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "f2d76792",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\nn\\parallel\\_functions.py:68: UserWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.\n",
      "  warnings.warn('Was asked to gather along dimension 0, but all '\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      \n",
       "      <progress value='52' max='26' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      [26/26 03:34]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "{'eval_loss': 0.6807233095169067,\n",
       " 'eval_f1': 0.14024870679318968,\n",
       " 'eval_roc_auc': 0.5349742837728174,\n",
       " 'eval_accuracy': 0.0,\n",
       " 'eval_jaccard': 0.07541261420571765,\n",
       " 'eval_runtime': 13.3709,\n",
       " 'eval_samples_per_second': 242.467,\n",
       " 'eval_steps_per_second': 1.945}"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from transformers import TrainingArguments, Trainer\n",
    "\n",
    "args = TrainingArguments(\n",
    "    f\"genre-prediction-distilbert\",\n",
    "    evaluation_strategy = \"epoch\",\n",
    "    save_strategy = \"epoch\",\n",
    "    per_device_train_batch_size=16,\n",
    "    gradient_accumulation_steps=4,\n",
    "    per_device_eval_batch_size=64,\n",
    "    num_train_epochs=10,\n",
    "    logging_steps=50,\n",
    "    load_best_model_at_end=True,\n",
    "    fp16=True\n",
    ")\n",
    "\n",
    "trainer = Trainer(\n",
    "    distil_model,\n",
    "    args,\n",
    "    train_dataset=description_encoded_dataset[\"train\"],\n",
    "    eval_dataset=description_encoded_dataset[\"test\"],\n",
    "    tokenizer=tokenizer,\n",
    "    data_collator=data_collator,\n",
    "    compute_metrics=compute_metrics\n",
    ")\n",
    "\n",
    "trainer.evaluate()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "379a486f",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\transformers\\optimization.py:391: FutureWarning: This implementation of AdamW is deprecated and will be removed in a future version. Use the PyTorch implementation torch.optim.AdamW instead, or set `no_deprecation_warning=True` to disable this warning\n",
      "  warnings.warn(\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\nn\\parallel\\_functions.py:68: UserWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.\n",
      "  warnings.warn('Was asked to gather along dimension 0, but all '\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\cuda\\nccl.py:15: UserWarning: PyTorch is not compiled with NCCL support\n",
      "  warnings.warn('PyTorch is not compiled with NCCL support')\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      \n",
       "      <progress value='1000' max='1000' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      [1000/1000 33:34, Epoch 9/10]\n",
       "    </div>\n",
       "    <table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       " <tr style=\"text-align: left;\">\n",
       "      <th>Epoch</th>\n",
       "      <th>Training Loss</th>\n",
       "      <th>Validation Loss</th>\n",
       "      <th>F1</th>\n",
       "      <th>Roc Auc</th>\n",
       "      <th>Accuracy</th>\n",
       "      <th>Jaccard</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>0.225500</td>\n",
       "      <td>0.214580</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.500000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>0.191100</td>\n",
       "      <td>0.181517</td>\n",
       "      <td>0.265005</td>\n",
       "      <td>0.578795</td>\n",
       "      <td>0.065083</td>\n",
       "      <td>0.152741</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>0.165800</td>\n",
       "      <td>0.163645</td>\n",
       "      <td>0.447409</td>\n",
       "      <td>0.659666</td>\n",
       "      <td>0.119988</td>\n",
       "      <td>0.288169</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>0.148400</td>\n",
       "      <td>0.152460</td>\n",
       "      <td>0.469803</td>\n",
       "      <td>0.667865</td>\n",
       "      <td>0.125540</td>\n",
       "      <td>0.307022</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>0.135700</td>\n",
       "      <td>0.146029</td>\n",
       "      <td>0.506707</td>\n",
       "      <td>0.686230</td>\n",
       "      <td>0.138186</td>\n",
       "      <td>0.339322</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>6</td>\n",
       "      <td>0.123200</td>\n",
       "      <td>0.142748</td>\n",
       "      <td>0.546603</td>\n",
       "      <td>0.714366</td>\n",
       "      <td>0.153917</td>\n",
       "      <td>0.376086</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>6</td>\n",
       "      <td>0.115200</td>\n",
       "      <td>0.140644</td>\n",
       "      <td>0.557181</td>\n",
       "      <td>0.719514</td>\n",
       "      <td>0.157927</td>\n",
       "      <td>0.386175</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>8</td>\n",
       "      <td>0.109000</td>\n",
       "      <td>0.140550</td>\n",
       "      <td>0.564871</td>\n",
       "      <td>0.725514</td>\n",
       "      <td>0.162246</td>\n",
       "      <td>0.393603</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>8</td>\n",
       "      <td>0.103400</td>\n",
       "      <td>0.139919</td>\n",
       "      <td>0.564481</td>\n",
       "      <td>0.724473</td>\n",
       "      <td>0.162554</td>\n",
       "      <td>0.393224</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>9</td>\n",
       "      <td>0.101100</td>\n",
       "      <td>0.139990</td>\n",
       "      <td>0.565733</td>\n",
       "      <td>0.724779</td>\n",
       "      <td>0.167181</td>\n",
       "      <td>0.394441</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table><p>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\nn\\parallel\\_functions.py:68: UserWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.\n",
      "  warnings.warn('Was asked to gather along dimension 0, but all '\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\cuda\\nccl.py:15: UserWarning: PyTorch is not compiled with NCCL support\n",
      "  warnings.warn('PyTorch is not compiled with NCCL support')\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\nn\\parallel\\_functions.py:68: UserWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.\n",
      "  warnings.warn('Was asked to gather along dimension 0, but all '\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\cuda\\nccl.py:15: UserWarning: PyTorch is not compiled with NCCL support\n",
      "  warnings.warn('PyTorch is not compiled with NCCL support')\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\nn\\parallel\\_functions.py:68: UserWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.\n",
      "  warnings.warn('Was asked to gather along dimension 0, but all '\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\cuda\\nccl.py:15: UserWarning: PyTorch is not compiled with NCCL support\n",
      "  warnings.warn('PyTorch is not compiled with NCCL support')\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\nn\\parallel\\_functions.py:68: UserWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.\n",
      "  warnings.warn('Was asked to gather along dimension 0, but all '\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\cuda\\nccl.py:15: UserWarning: PyTorch is not compiled with NCCL support\n",
      "  warnings.warn('PyTorch is not compiled with NCCL support')\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\nn\\parallel\\_functions.py:68: UserWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.\n",
      "  warnings.warn('Was asked to gather along dimension 0, but all '\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\cuda\\nccl.py:15: UserWarning: PyTorch is not compiled with NCCL support\n",
      "  warnings.warn('PyTorch is not compiled with NCCL support')\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\nn\\parallel\\_functions.py:68: UserWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.\n",
      "  warnings.warn('Was asked to gather along dimension 0, but all '\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\cuda\\nccl.py:15: UserWarning: PyTorch is not compiled with NCCL support\n",
      "  warnings.warn('PyTorch is not compiled with NCCL support')\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\nn\\parallel\\_functions.py:68: UserWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.\n",
      "  warnings.warn('Was asked to gather along dimension 0, but all '\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\cuda\\nccl.py:15: UserWarning: PyTorch is not compiled with NCCL support\n",
      "  warnings.warn('PyTorch is not compiled with NCCL support')\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\nn\\parallel\\_functions.py:68: UserWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.\n",
      "  warnings.warn('Was asked to gather along dimension 0, but all '\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\cuda\\nccl.py:15: UserWarning: PyTorch is not compiled with NCCL support\n",
      "  warnings.warn('PyTorch is not compiled with NCCL support')\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\nn\\parallel\\_functions.py:68: UserWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.\n",
      "  warnings.warn('Was asked to gather along dimension 0, but all '\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\cuda\\nccl.py:15: UserWarning: PyTorch is not compiled with NCCL support\n",
      "  warnings.warn('PyTorch is not compiled with NCCL support')\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "TrainOutput(global_step=1000, training_loss=0.15187877035140993, metrics={'train_runtime': 2016.1971, 'train_samples_per_second': 63.699, 'train_steps_per_second': 0.496, 'total_flos': 8453222092487700.0, 'train_loss': 0.15187877035140993, 'epoch': 9.95})"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "trainer.train()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "348f1b00",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a3b21172",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5302ebf0",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ff565044",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "c38b4619",
   "metadata": {},
   "source": [
    "# (Task-Specific Distilation)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "2eea2100",
   "metadata": {},
   "outputs": [],
   "source": [
    "from transformers import TrainingArguments, Trainer\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "# Custom TrainingArguments class to add distillation specific parameters\n",
    "class DistillationTrainingArguments(TrainingArguments):\n",
    "    def __init__(self, *args, alpha=0.5, temperature=2.0, **kwargs):\n",
    "        super().__init__(*args, **kwargs)\n",
    "\n",
    "        # Alpha is the weight for the original student loss\n",
    "        # A higher value means more focus on the student's original task\n",
    "        self.alpha = alpha\n",
    "\n",
    "        # Temperature parameter to soften probability distributions before calculating distillation loss\n",
    "        # Higher value makes the distribution more uniform, carrying more information about the teacher model's outputs\n",
    "        self.temperature = temperature\n",
    "\n",
    "# Custom Trainer class to implement knowledge distillation\n",
    "class DistillationTrainer(Trainer):\n",
    "    def __init__(self, *args, teacher_model=None, **kwargs):\n",
    "        super().__init__(*args, **kwargs)\n",
    "        \n",
    "        # The teacher model, a pre-trained model that the student model will learn from\n",
    "        self.teacher = teacher_model\n",
    "\n",
    "        # Move the teacher model to the same device as the student model\n",
    "        # This is necessary for the computations in the forward pass\n",
    "        self._move_model_to_device(self.teacher, self.model.device)\n",
    "\n",
    "        # Set teacher model to eval mode because we only want to use it for inference, not for training\n",
    "        self.teacher.eval()\n",
    "\n",
    "    def compute_loss(self, model, inputs, return_outputs=False):\n",
    "        # Compute the output of the student model on the inputs\n",
    "        outputs_student = model(**inputs)\n",
    "        # Original loss of the student model (e.g., cross entropy for classification)\n",
    "        student_loss = outputs_student.loss\n",
    "\n",
    "        # Compute the output of the teacher model on the inputs\n",
    "        # We don't need gradients for the teacher model, so we use torch.no_grad to avoid unnecessary computation\n",
    "        with torch.no_grad():\n",
    "            outputs_teacher = self.teacher(**inputs)\n",
    "\n",
    "        # Check that the sizes of the student and teacher outputs match\n",
    "        assert outputs_student.logits.size() == outputs_teacher.logits.size()\n",
    "\n",
    "        # Kullback-Leibler divergence loss function, comparing the softened output distributions of the student and teacher models\n",
    "        loss_function = nn.KLDivLoss(reduction=\"batchmean\")\n",
    "\n",
    "        # Calculate the distillation loss between the student and teacher outputs\n",
    "        # We apply log_softmax to the student's outputs and softmax to the teacher's outputs before calculating the loss\n",
    "        # This is due to the expectation of log probabilities for the input and probabilities for the target in nn.KLDivLoss\n",
    "        \n",
    "        # Note multiplying by temperature^2 is not to punish the loss like we did during reward modeling for SAWYER..\n",
    "        # It is done because we divided both student and teacher logits by temperature so this operation puts the loss\n",
    "        # back on the same scale as student_loss, which we are about to combine using a weighted mean\n",
    "        loss_logits = (loss_function(\n",
    "            F.log_softmax(outputs_student.logits / self.args.temperature, dim=-1),\n",
    "            F.softmax(outputs_teacher.logits / self.args.temperature, dim=-1)) * (self.args.temperature ** 2))\n",
    "\n",
    "        # The total loss is a weighted combination of the student's original loss and the distillation loss\n",
    "        loss = self.args.alpha * student_loss + (1. - self.args.alpha) * loss_logits\n",
    "\n",
    "        # Depending on the return_outputs parameter, return either the loss alone or the loss and the student's outputs\n",
    "        return (loss, outputs_student) if return_outputs else loss\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "0e7a7950",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "tokenizer = AutoTokenizer.from_pretrained(TEACHER_MODEL)\n",
    "\n",
    "trained_model = AutoModelForSequenceClassification.from_pretrained(\n",
    "    f\"genre-prediction-bert\", problem_type=\"multi_label_classification\",\n",
    ")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "31536062",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Some weights of the model checkpoint at distilbert-base-uncased were not used when initializing DistilBertForSequenceClassification: ['vocab_layer_norm.bias', 'vocab_transform.weight', 'vocab_transform.bias', 'vocab_layer_norm.weight', 'vocab_projector.bias']\n",
      "- This IS expected if you are initializing DistilBertForSequenceClassification from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).\n",
      "- This IS NOT expected if you are initializing DistilBertForSequenceClassification from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).\n",
      "Some weights of DistilBertForSequenceClassification were not initialized from the model checkpoint at distilbert-base-uncased and are newly initialized: ['classifier.weight', 'pre_classifier.weight', 'pre_classifier.bias', 'classifier.bias']\n",
      "You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n"
     ]
    }
   ],
   "source": [
    "# define student model\n",
    "student_model = AutoModelForSequenceClassification.from_pretrained(\n",
    "    'distilbert-base-uncased',\n",
    "    num_labels=len(unique_labels),\n",
    "    id2label=id2label,\n",
    "    label2id=label2id,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "8a5f0d0e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# define training args\n",
    "training_args = DistillationTrainingArguments(\n",
    "    output_dir='distilled-genre-prediction',\n",
    "    evaluation_strategy = \"epoch\",\n",
    "    save_strategy = \"epoch\",\n",
    "    num_train_epochs=10,\n",
    "    logging_steps=50,\n",
    "    per_device_train_batch_size=16,\n",
    "    gradient_accumulation_steps=4,\n",
    "    per_device_eval_batch_size=64,\n",
    "    load_best_model_at_end=True,\n",
    "    alpha=0.2,\n",
    "    temperature=8.0,\n",
    "    use_mps_device=True\n",
    "#     fp16=True\n",
    "    )\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "4fb3606a",
   "metadata": {},
   "outputs": [],
   "source": [
    "distil_trainer = DistillationTrainer(\n",
    "    student_model,\n",
    "    training_args,\n",
    "    teacher_model=trained_model,\n",
    "    train_dataset=description_encoded_dataset[\"train\"],\n",
    "    eval_dataset=description_encoded_dataset[\"test\"],\n",
    "    data_collator=data_collator,\n",
    "    tokenizer=tokenizer,\n",
    "    compute_metrics=compute_metrics,\n",
    ")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "9f398e8a",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      \n",
       "      <progress value='51' max='51' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      [51/51 01:50]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n",
      "To disable this warning, you can either:\n",
      "\t- Avoid using `tokenizers` before the fork if possible\n",
      "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n",
      "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n",
      "To disable this warning, you can either:\n",
      "\t- Avoid using `tokenizers` before the fork if possible\n",
      "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\u001b[34m\u001b[1mwandb\u001b[0m: Currently logged in as: \u001b[33mprofoz\u001b[0m. Use \u001b[1m`wandb login --relogin`\u001b[0m to force relogin\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n",
      "To disable this warning, you can either:\n",
      "\t- Avoid using `tokenizers` before the fork if possible\n",
      "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n",
      "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n",
      "To disable this warning, you can either:\n",
      "\t- Avoid using `tokenizers` before the fork if possible\n",
      "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "7e15ce33bc044baf987d4a15785faa81",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "VBox(children=(Label(value='Waiting for wandb.init()...\\r'), FloatProgress(value=0.01675316458567977, max=1.0)…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "wandb version 0.15.9 is available!  To upgrade, please run:\n",
       " $ pip install wandb --upgrade"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Tracking run with wandb version 0.14.0"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Run data is saved locally in <code>/Users/sinanozdemir/Teaching/Pearson/quick-start-llms/notebooks/wandb/run-20230830_082540-vi5kojep</code>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Syncing run <strong><a href='https://wandb.ai/profoz/huggingface/runs/vi5kojep' target=\"_blank\">woven-salad-179</a></strong> to <a href='https://wandb.ai/profoz/huggingface' target=\"_blank\">Weights & Biases</a> (<a href='https://wandb.me/run' target=\"_blank\">docs</a>)<br/>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       " View project at <a href='https://wandb.ai/profoz/huggingface' target=\"_blank\">https://wandb.ai/profoz/huggingface</a>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       " View run at <a href='https://wandb.ai/profoz/huggingface/runs/vi5kojep' target=\"_blank\">https://wandb.ai/profoz/huggingface/runs/vi5kojep</a>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "{'eval_loss': 0.19041641056537628,\n",
       " 'eval_f1': 0.12052846007112074,\n",
       " 'eval_roc_auc': 0.4869344628339549,\n",
       " 'eval_accuracy': 0.0,\n",
       " 'eval_jaccard': 0.06412890938251804,\n",
       " 'eval_runtime': 113.5274,\n",
       " 'eval_samples_per_second': 28.557,\n",
       " 'eval_steps_per_second': 0.449}"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "distil_trainer.evaluate()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "39d08276",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/homebrew/lib/python3.10/site-packages/transformers/optimization.py:411: FutureWarning: This implementation of AdamW is deprecated and will be removed in a future version. Use the PyTorch implementation torch.optim.AdamW instead, or set `no_deprecation_warning=True` to disable this warning\n",
      "  warnings.warn(\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      \n",
       "      <progress value='15' max='2020' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      [  15/2020 00:52 < 2:16:13, 0.25 it/s, Epoch 0.07/10]\n",
       "    </div>\n",
       "    <table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       " <tr style=\"text-align: left;\">\n",
       "      <th>Epoch</th>\n",
       "      <th>Training Loss</th>\n",
       "      <th>Validation Loss</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "  </tbody>\n",
       "</table><p>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "distil_trainer.train()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "2f17b844",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\transformers\\optimization.py:391: FutureWarning: This implementation of AdamW is deprecated and will be removed in a future version. Use the PyTorch implementation torch.optim.AdamW instead, or set `no_deprecation_warning=True` to disable this warning\n",
      "  warnings.warn(\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\nn\\parallel\\_functions.py:68: UserWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.\n",
      "  warnings.warn('Was asked to gather along dimension 0, but all '\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\cuda\\nccl.py:15: UserWarning: PyTorch is not compiled with NCCL support\n",
      "  warnings.warn('PyTorch is not compiled with NCCL support')\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      \n",
       "      <progress value='1000' max='1000' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      [1000/1000 3:34:20, Epoch 9/10]\n",
       "    </div>\n",
       "    <table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       " <tr style=\"text-align: left;\">\n",
       "      <th>Epoch</th>\n",
       "      <th>Training Loss</th>\n",
       "      <th>Validation Loss</th>\n",
       "      <th>F1</th>\n",
       "      <th>Roc Auc</th>\n",
       "      <th>Accuracy</th>\n",
       "      <th>Jaccard</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>0.886300</td>\n",
       "      <td>0.630698</td>\n",
       "      <td>0.460421</td>\n",
       "      <td>0.730562</td>\n",
       "      <td>0.041024</td>\n",
       "      <td>0.299056</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>0.584000</td>\n",
       "      <td>0.415083</td>\n",
       "      <td>0.518557</td>\n",
       "      <td>0.721375</td>\n",
       "      <td>0.123072</td>\n",
       "      <td>0.350035</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>0.451300</td>\n",
       "      <td>0.333049</td>\n",
       "      <td>0.540035</td>\n",
       "      <td>0.722533</td>\n",
       "      <td>0.149599</td>\n",
       "      <td>0.369896</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>0.365900</td>\n",
       "      <td>0.294507</td>\n",
       "      <td>0.552130</td>\n",
       "      <td>0.725916</td>\n",
       "      <td>0.150524</td>\n",
       "      <td>0.381340</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>0.306600</td>\n",
       "      <td>0.284926</td>\n",
       "      <td>0.555126</td>\n",
       "      <td>0.725027</td>\n",
       "      <td>0.151450</td>\n",
       "      <td>0.384203</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>6</td>\n",
       "      <td>0.261700</td>\n",
       "      <td>0.270110</td>\n",
       "      <td>0.568314</td>\n",
       "      <td>0.733727</td>\n",
       "      <td>0.157310</td>\n",
       "      <td>0.396954</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>6</td>\n",
       "      <td>0.233000</td>\n",
       "      <td>0.272241</td>\n",
       "      <td>0.567286</td>\n",
       "      <td>0.732110</td>\n",
       "      <td>0.160703</td>\n",
       "      <td>0.395952</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>8</td>\n",
       "      <td>0.212700</td>\n",
       "      <td>0.266215</td>\n",
       "      <td>0.570596</td>\n",
       "      <td>0.734322</td>\n",
       "      <td>0.159161</td>\n",
       "      <td>0.399185</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>8</td>\n",
       "      <td>0.199100</td>\n",
       "      <td>0.265983</td>\n",
       "      <td>0.570329</td>\n",
       "      <td>0.732915</td>\n",
       "      <td>0.162554</td>\n",
       "      <td>0.398923</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>9</td>\n",
       "      <td>0.190700</td>\n",
       "      <td>0.262912</td>\n",
       "      <td>0.573898</td>\n",
       "      <td>0.735281</td>\n",
       "      <td>0.163479</td>\n",
       "      <td>0.402424</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table><p>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\nn\\parallel\\_functions.py:68: UserWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.\n",
      "  warnings.warn('Was asked to gather along dimension 0, but all '\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\cuda\\nccl.py:15: UserWarning: PyTorch is not compiled with NCCL support\n",
      "  warnings.warn('PyTorch is not compiled with NCCL support')\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\nn\\parallel\\_functions.py:68: UserWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.\n",
      "  warnings.warn('Was asked to gather along dimension 0, but all '\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\cuda\\nccl.py:15: UserWarning: PyTorch is not compiled with NCCL support\n",
      "  warnings.warn('PyTorch is not compiled with NCCL support')\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\nn\\parallel\\_functions.py:68: UserWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.\n",
      "  warnings.warn('Was asked to gather along dimension 0, but all '\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\cuda\\nccl.py:15: UserWarning: PyTorch is not compiled with NCCL support\n",
      "  warnings.warn('PyTorch is not compiled with NCCL support')\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\nn\\parallel\\_functions.py:68: UserWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.\n",
      "  warnings.warn('Was asked to gather along dimension 0, but all '\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\cuda\\nccl.py:15: UserWarning: PyTorch is not compiled with NCCL support\n",
      "  warnings.warn('PyTorch is not compiled with NCCL support')\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\nn\\parallel\\_functions.py:68: UserWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.\n",
      "  warnings.warn('Was asked to gather along dimension 0, but all '\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\cuda\\nccl.py:15: UserWarning: PyTorch is not compiled with NCCL support\n",
      "  warnings.warn('PyTorch is not compiled with NCCL support')\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\nn\\parallel\\_functions.py:68: UserWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.\n",
      "  warnings.warn('Was asked to gather along dimension 0, but all '\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\cuda\\nccl.py:15: UserWarning: PyTorch is not compiled with NCCL support\n",
      "  warnings.warn('PyTorch is not compiled with NCCL support')\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\nn\\parallel\\_functions.py:68: UserWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.\n",
      "  warnings.warn('Was asked to gather along dimension 0, but all '\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\cuda\\nccl.py:15: UserWarning: PyTorch is not compiled with NCCL support\n",
      "  warnings.warn('PyTorch is not compiled with NCCL support')\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\nn\\parallel\\_functions.py:68: UserWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.\n",
      "  warnings.warn('Was asked to gather along dimension 0, but all '\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\cuda\\nccl.py:15: UserWarning: PyTorch is not compiled with NCCL support\n",
      "  warnings.warn('PyTorch is not compiled with NCCL support')\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\nn\\parallel\\_functions.py:68: UserWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.\n",
      "  warnings.warn('Was asked to gather along dimension 0, but all '\n",
      "C:\\Users\\sinan\\anaconda3\\envs\\DL\\lib\\site-packages\\torch\\cuda\\nccl.py:15: UserWarning: PyTorch is not compiled with NCCL support\n",
      "  warnings.warn('PyTorch is not compiled with NCCL support')\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "TrainOutput(global_step=1000, training_loss=0.3958173961639404, metrics={'train_runtime': 12865.4267, 'train_samples_per_second': 9.983, 'train_steps_per_second': 0.078, 'total_flos': 8453222092487700.0, 'train_loss': 0.3958173961639404, 'epoch': 9.95})"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "distil_trainer.train()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "64f21496",
   "metadata": {},
   "outputs": [],
   "source": [
    "distil_trainer.save_model()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "1b15cceb",
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAArcAAAGMCAYAAADAyIqEAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdd3wU1d7H8c/uJpveCymUEMJCgIROKNJFuSCg2LgI+oC990vxinqvgEqTclEseFVAAVEUC1dEUJQmClIMChJ6CqT3bHbP88dkJ9kUCAgkhN+bV167O3Nm5swW9rtnzpwxKKUUQgghhBBCNADGuq6AEEIIIYQQF4qEWyGEEEII0WBIuBVCCCGEEA2GhFshhBBCCNFgSLgVQgghhBANhoRbIYQQQgjRYEi4FUIIIYQQDYaEWyGEEEII0WBIuBVCCCHqObnekhC1J+FWiFqaP38+rVq1qutq/GW13Y+ff/6Z++67j4SEBNq1a0e/fv2YNGkSR48evQS1bHgcz/uZ/vLz8y95vQYMGMDEiRMv+Hrz8vK4//77ad++PV27duXw4cMXdP3VPZ/x8fFcc801vPzyy+Tk5DiVnzhxIgMGDNAfp6SkMGbMGOLi4ujRoweFhYXMnDmThIQEOnTowOrVqy9ofc9XSkoK9957LydOnKixzPHjx/XnYPny5dWWyc3NJS4ujlatWrFt27a/XK/Kz2dtNJT/Q0X951LXFRBC1D9btmzhrrvuYuDAgbz44ov4+vpy9OhRFi9ezM0338zKlStp2rRpXVfzslRT+ADw8PC4hDW5uFavXs23337LlClTaNmyJY0bN74o23E8n0opCgoK2LNnD2+++SYbNmzggw8+ICAgAIAHHniA22+/XV/u3XffZefOncyYMYNGjRpx7Ngx3nzzTW655RZGjBhBdHT0Ranvudq8eTMbN27k2WefPWtZo9HIV199xa233lpl3rp16ygpKbkYVRSi3pFwK4So4vXXXycuLo558+bp0xISEujbty+DBg3inXfe4bnnnqvDGl6+OnToUNdVuCSysrIAGD16NAaD4aJtp/Lz2atXL3r06MFtt93GrFmzePHFFwGq/BjLysoiNDSUIUOGALB9+3YAhg4dSpcuXS5afS+mTp06sX37djIyMggMDHSa98UXXxAbG0tiYmId1U6IS0e6JQjxF6xcuZKRI0fSoUMH4uPjGTFiBF9++aVTmaNHj/LII4/QrVs3unbtyt13382BAwf0+fn5+UyfPp0+ffrQoUMHRo4cybfffqvPLyoqYtasWVxzzTW0a9eOTp06MW7cOKcvqYkTJ3LHHXfw3HPP0aVLF2644QZKS0spLi5m+vTp9OrVi44dOzJp0iSKi4vPul+nT5+udnpoaCj//Oc/6dWrlz5NKcXSpUsZOnQo8fHxDBo0iDfffNOpj+CPP/7I6NGj6dy5MwkJCTz55JMkJyfr8z/++GPatGnDypUrueqqq+jTp4/+HH3zzTeMHDmSuLg4evXqxYsvvkhBQcEZ62+z2Vi6dCnDhg0jPj6efv36MXPmTH3f16xZQ6tWrdi/f7/Tct999x2tWrVi9+7dgBaApkyZQs+ePYmLi+OWW25hy5YtTsu0atWKBQsWcOONN9K5c2cWLlx4tqf3rCZOnMjYsWP56KOP6N+/Px07duT222/nt99+cyp3+PBhHnnkEXr16kWHDh0YO3YsP//8s1OZs72/AKxWK6+88oq+nvHjx3PkyBF9fkZGBk899RS9evUiLi6OESNGnPGw/dixY5k/fz4ArVu31rs95ObmMn36dK6++mri4uK47rrr+Oijj5yWHTBgANOmTeOOO+6gU6dOTJky5Zyfv/bt23P11VezevVqCgsLAefD6AMGDODjjz/m5MmTtGrVivnz5zN27FgA7rjjDqfD7StXrmTo0KF615z58+dTWlqqz6/ps2e323njjTcYNGgQ7dq149prr+X999+v8jw988wzvPHGG/Tr14+4uDhGjRrFr7/+Cmifi0mTJgEwcODAs3YfGTRoEEajkf/9739O0zMzM9m6dStDhw6tskxt3kPZ2dlMmjSJhIQEunbtyowZM7Db7VXWda6f1WPHjnH//feTkJBA+/btufXWW/nuu+/OuI9C1IoSQtTKvHnzlMVi0R8vWbJEtW7dWi1YsEBt3bpVrV27Vt14442qTZs26sSJE0oppVJTU1W3bt3U0KFD1eeff642btyobr75ZtWzZ0+Vnp6ubDabGjVqlOratat6//331ebNm9WECRNUbGys2rp1q1JKqYcfflh1795drVy5Um3btk0tX75c9ezZU1177bXKbrcrpZSaMGGCatOmjbrjjjvU5s2b1bp16/Rl27dvr9555x21ceNGdf/996u2bds67Ud1XnnlFWWxWNSYMWPUypUr1dGjR2ssO3PmTBUbG6tefvll9cMPP6hFixap2NhYtWDBAqWUUqtXr1YWi0U99thjauPGjeqTTz5R/fv3V71791anT59WSim1atUqZbFY1IABA9SGDRvUqlWrlN1uV5999pmyWCzqySefVN99951atmyZ6tq1q7rjjjv0fa/O5MmTVZs2bdTs2bPVDz/8oN544w3Vvn17NX78eGW321VhYaHq2LGjmjlzptNyTz31lLr22muVUkoVFRWp4cOHq549e6oVK1aojRs3qocffli1adNGbd68WV/GYrGoNm3aqEWLFqmNGzeq/fv3V1snx/vHarVW+2ez2fSyEyZMUJ07d1Y9e/ZUH330kVq3bp0aNmyY6tSpk0pJSVFKKXXgwAHVsWNHdf3116svv/xSrVu3To0dO1a1bdtWbdu2TSmlavX+6t+/v2rdurW666671Pfff69WrVqlunTpom644Qa9PuPHj1cjRoxQ69atU5s3b1YTJ05UFotFX0dlBw4cUJMnT1YWi0Xt3LlTHTlyRBUWFqrrrrtOde/eXS1dulR9//33asqUKcpisajXXntNX7Z///6qTZs2aurUqeqHH35QO3bsOOPzWZOVK1cqi8WiPxcTJkxQ/fv3V0optW/fPnX33XerXr16qZ07d6rk5GS1ZMkSZbFY1JIlS9S+ffuUUkq9/vrrqlWrVurf//632rRpk3rjjTdUXFycmjRpktNrVd1n79lnn1Vt27ZV8+bNU5s2bVKzZ8/W/79wGDNmjOrcubO65ZZb1Lp169TXX3+tBg4cqPr06aNKS0tVenq6mjNnjrJYLOrrr79WR44cqXZfjx07piwWi1q1apW655571NixY53mf/DBB2rgwIFq69atTq9bbd9DN910k+revbtasWKFWr9+vfr73/+u2rZtqz+fSqlafVYrvmY2m0397W9/U7fffrvauHGj+uGHH9Q999yj2rRpow4fPlzj6ypEbUi4FaKWKn+ZTp8+Xb3yyitOZfbu3assFotas2aNUkqpl156ScXHx6u0tDS9TGpqqurXr59av3692rBhg7JYLOqbb77R59vtdjVq1Cj16quvquLiYjV+/Hj1xRdfOG1n8eLFymKxqNTUVKWU9gVrsVicvhT++OMP/cvawWazqSFDhpw13BYXF6tn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zpxJVFRUlflnCuCOZd999139h2hFFT+PF8OQIUN46qmnOH36NF9++WWNIbs276GAgAAyMzOx2WyYTCa9TMX35/l+Vhs1asTzzz/Pc889x/79+1m7di1vvvkmfn5+1YZkIWpLuiUIUY2DBw/y9ttvc/z4cX1acnKy3gqUmZlJUlISN910E/Hx8XoA/v7774HyVpcuXbqwa9cu0tPT9fVkZGRw9913s379erp06YLVanU6Q1gpxTPPPMNrr73G3r17KS4u5t5773U67OkItuoMVy3q3r07AGvXrnWa7ujSUJOoqCgKCwt57733qm09SkpKIiQkhMDAQP1w9vr1653KvPvuuzz66KM0b96ckJAQ1qxZ4zT/2LFj7Nq1i06dOtVYj+joaIKCgjh+/DhxcXH6X1hYGLNmzarS6uvg+HKtvM0vvvgCm83mdFh8xIgRpKamMn/+fAwGA4MHD3ZaT3JyMkFBQU7b37JlC2+99ZbTF/3FcPToUQ4ePKg/Tk1NZdeuXfTo0QOArl27smHDBr0lGrQfYF988QVxcXGYzeazvr9q48SJE/Tt21d/H0VHR3P33XfTs2dPUlJSar0/Xbt25cSJE1XOxP/ss89wdXUlPj6+1us6m8TERL755htuvPFG/QfpuWrfvj2urq6kpqY6vf6urq7MmjXL6f+GyhzdSTIzM52WzcrK4tVXXz3rD8yKzqd7Rv/+/XFzc+P9999n165dNYbb2ryHevToQWlpKd98841epqSkxKmrwfl8Vnfu3EnPnj3ZvXs3BoOB2NhYHn/8cSwWyzm9r4SojrTcClGNXr164enpyb///W/uvPNOkpKS+PLLLxk/fjygHYaMjIxk6dKlhIWF4evryw8//MC7774LlPeX+7//+z9Wr17NnXfeyX333YebmxuLFi0iNDSU66+/Hh8fH32IrkcffZRmzZqxZs0a/vjjD5599lkCAwNxcXFhxowZjB8/npKSEj7++GM2btwIcMZhdpo1a8att97KnDlzKC0tJTY2lk8//ZTff//9jPvu5+fHhAkTeO655xg9ejS33HILTZo0ITc3Vz98OHPmTAwGA4GBgdx+++28++67mM1munfvzp49e1iyZAlPPPEEZrOZJ554gkmTJvH4449z/fXXk5mZyYIFC/Dz82PcuHE11sNkMvH4448zZcoUTCYT/fv3Jycnh4ULF5Ka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t9m9e7d+//jx4xk+fDh+fn7UrFmTlStXArBr1y7atGmDj48P3bp1Y/369emGQDx58oRPP/2UevXqUatWLfr378+lS5eMkjk0NJRKlSqxb98+unfvjo+PD82bN8/QU7579246duxI1apVad68OWvXrtXvu3nzJh9++CF169bF29ubli1bsn79ev3+hIQEJk2aRIMGDfDx8aFTp0788ssv+v2KorBq1SqaN29OtWrV6NixIzt37kz3/qdPn6Z79+5UrVqVTp06vfK35XmJFLemKiUBTqwArSwzKYQQmVEUhfjkVIO+dpy/x9DvzhIQ/oSk1DQCwp8w9Luz7Dh/z+C2FEUxynlcvHiRXbt20aNHD6O0BxASEsLcuXMpUaIEderUMVq7//TgwQP8/Pzw9PRk69at7NixAx8fHyZMmEBkZKT+uAMHDvDmm2+yZcsWOnTowOHDh/nkk0/o1q0bO3fupGvXrsyfP19/vKIoDB48mKCgIFauXMmmTZuoXr06vXr14urVq0bLP2vWLIYOHcr27dupX78+n376KSEhIQD8/PPP+Pv7065dO3bu3MnHH3/MokWL2Lx5MwkJCbz33nvY2dnx/fffs2fPHtq0acOMGTP08/IvXryYgIAAvv76a/bu3UujRo0YPXq0frzswoUL+f7775k8eTK7du2if//+fPbZZ/zf//0foLuGfn5+eHl5sW3bNj744AO+/PJLo527mmRYgqk6PB2OLYXbv0KfTWqnEUKIXEVRFLqtOM6Z4Mev9/p/fB+58bzBbdQu48zmofUNnkN05cqVrFmzBtAtUpSSkkK1atVo27ZtuuPCwsKoUaNGhtc7ODjw+++/p9v24nEpKSlYWlrSsGFDZs6ciZ2dnX5aKGNLTk5m+PDhDBw4UL/E6/vvv8/WrVsJCgrSr2bl5OTEoEGD9K/z9/endevWDBw4EICyZcsSHBys7xk9ceIE586d4/jx47i46G6iHjNmDGfPnmXDhg3MmmWcWYPee+89mjdvDsAnn3zC5s2buXDhAqVKlWLdunW0adOGIUOGAODu7k5cXBy2trYkJCTQv39/evfujb29PQDDhw9n5cqVBAQE4OXlxd27d7G3t6d06dI4ODgwcuRIateujZOTE/Hx8axbt445c+bQtGlTAEqXLs29e/dYvXo1ffr0YdOmTRQuXJgpU6Zgbm5OuXLluH//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RaNGjfDx8aF///4EBgbq24iOjmbq1Kk0btyYqlWr0qtXL06fPq3fn5CQwKRJk2jQoAE+Pj506tSJX375Rd/+smXLuHfvHpUqVSI0NJTx48fTr18//etDQkIYNmwYtWrVom7duowePZrIyEgDPn2dd955B0tLS/bu3QvoerUrVaqk3/+qz//ZcRMmTGD8+PGEhoZSqVIlTp48aVAGW1tbg3P/G2trazQaDRqNxuhtvw4pbvO6X7+AqEBwKAFvTVc7jRBC5C/JcS//SklMf2xsqO7eh8ykJqXv0X1luwnZcirr169n5cqV+Pv7s3//fpYvX86dO3eYNWsWoCsyhw8fTteuXdm7dy/Lli3j1KlTzJkzJ0NbFy5cYPDgwbz77ruMHTv2pe+5ZcsWateuTaFChWjbti0REREcPnxYvz8tLY3333+f4OBgVq1axZo1a7h48WKGMaDnzp3j1KlTfP3116xbt46wsDCmTp0K6HoQ/fz8OH36NLNnz2bbtm14enoyYMAALl26BMDixYsJCAjg66+/Zu/evTRq1IjRo0cTGhqKn58ffn5+uLq6cvToUYoXL57uvZ88eULv3r2Jj49n3bp1rFu3jnv37r1WD3SBAgUoWbIk169fz7Dv3z7/o0ePAjBx4sSXDiF4ldTUVLZv387t27fp1KmTwa/PjKIonDt3jvXr19OyZUsKFChglHb/KxmWkJcFH4cTX+ked5DFGoQQwuhmlHj5vgqtoM/m5883GFAwLPLJfPgCQIkaMOS3rLeVRaVLl2bWrFk0a9YMADc3N9q0acOePXsAePDgAcnJyZQoUQI3Nzfc3NxYsWJFhrGnV65cYdKkSbz33nsMHz78pe9348YNLl++rC9C69evj4uLCxs3bqRlS91vGf/66y8uXrzIvn378PDwAGDRokU0bdo0XVupqanMmTOHggV1/8/169ePuXPnArqi78qVK+zatYuKFSsC8L///Y8LFy6wevVqFi1axN27d7G3t6d06dI4ODgwcuRIateujZOTEwUKFMDOzu6lv+bfu3cvT548YeHChfr3nz59Ojt27CApKQlra2sDroLuV/RPnjzJsP3fPv9n2Z792v9lPeovGjx4MObmuhvMExMTSUtLo3fv3lSoUCHdcbt27WL//v0ZXt+0aVMWLFigf3769Glq1KgB6Arb5ORkXFxcaNu2LaNGjcri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\n",
      "text/plain": [
       "<Figure size 800x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# Assuming that your epochs start from 0 and increase by 2\n",
    "epochs = range(1,11)\n",
    "\n",
    "# Jaccard scores for each model (replace with your values)\n",
    "bert_jaccard = [0.150144, 0.294118, 0.369182, 0.380621, 0.408421, 0.434089, 0.443303, 0.449669, 0.452132, 0.455674]\n",
    "agnostic_distilbert_jaccard = [0.000000, 0.152741, 0.288169, 0.307022, 0.339322, 0.376086, 0.386175, 0.393603, 0.393224, 0.394441]\n",
    "specific_distilbert_jaccard = [0.299056, 0.350035, 0.369896, 0.381340, 0.384203, 0.396954, 0.395952, 0.399185, 0.398923, 0.402424]\n",
    "\n",
    "# F1 scores for BERT Large Uncased\n",
    "bert_f1 = [0.261087, 0.454545, 0.539274, 0.551376, 0.579970, 0.605386, 0.614290, 0.620375, 0.622715, 0.626066]\n",
    "# F1 scores for Task Agnostic DistilBERT\n",
    "agnostic_distilbert_f1 = [0.000000, 0.265005, 0.447409, 0.469803, 0.506707, 0.546603, 0.557181, 0.564871, 0.564481, 0.565733]\n",
    "# F1 scores for Task Specific DistilBERT\n",
    "specific_distilbert_f1 = [0.460421, 0.518557, 0.540035, 0.552130, 0.555126, 0.568314, 0.567286, 0.570596, 0.570329, 0.573898]\n",
    "\n",
    "\n",
    "plt.figure(figsize=(8, 4))\n",
    "plt.plot(epochs, bert_jaccard, marker='o', markersize=4, linestyle='-', label='BERT Large Uncased')\n",
    "plt.plot(epochs, agnostic_distilbert_jaccard, marker='s', markersize=4, linestyle='--', label='Task Agnostic DistilBERT')\n",
    "plt.plot(epochs, specific_distilbert_jaccard, marker='^', markersize=4, linestyle='-.', label='Task Specific DistilBERT')\n",
    "\n",
    "plt.xlabel('Epoch')\n",
    "plt.ylabel('Jaccard Score')\n",
    "plt.title('Jaccard Score over Epochs for Different Models')\n",
    "plt.legend()\n",
    "plt.grid(True)\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "028bc464",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "9a48ff20",
   "metadata": {},
   "source": [
    "# Using our models"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "849d1ccd",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Our base model\n",
    "trained_model = AutoModelForSequenceClassification.from_pretrained(\n",
    "    f\"genre-prediction-bert\", problem_type=\"multi_label_classification\",\n",
    ")\n",
    "\n",
    "# Our task specific model\n",
    "task_specific_model = AutoModelForSequenceClassification.from_pretrained(\n",
    "    'distilled-genre-prediction',problem_type=\"multi_label_classification\", \n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "id": "51ba896d",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "batch = data_collator(list(description_encoded_dataset['test'])[:16])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "id": "68746d8b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "8.65 s ± 121 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
     ]
    }
   ],
   "source": [
    "%timeit trained_model(**batch)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "id": "2e7469b3",
   "metadata": {},
   "outputs": [],
   "source": [
    "distil_batch = {k: v for k, v in batch.items() if k != 'token_type_ids'}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "id": "4830534f",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.35 s ± 17 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
     ]
    }
   ],
   "source": [
    "%timeit task_specific_model(**distil_batch)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "eb64cedd",
   "metadata": {},
   "outputs": [],
   "source": [
    "# ^^ shows how our distilled model is over 6x faster"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "id": "0bd06113",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Trained Model has 335184938 parameters.\n",
      "Data type of the parameter in trained_model: torch.float32\n",
      "Task Specific Model has 66985770 parameters.\n",
      "Data type of the parameter in task_specific_model: torch.float32\n",
      "Estimated memory for trained_model: 1278.6290664672852 MB\n",
      "Estimated memory for task_specific_model: 255.53043365478516 MB\n"
     ]
    }
   ],
   "source": [
    "# Count the number of parameters in the trained_model\n",
    "num_params_trained = sum(p.numel() for p in trained_model.parameters())\n",
    "print(f'Trained Model has {num_params_trained} parameters.')\n",
    "\n",
    "# Print the data types of the parameters in the trained_model\n",
    "for p in trained_model.parameters():\n",
    "    print(f'Data type of the parameter in trained_model: {p.dtype}')\n",
    "    break  # We break after printing the first one assuming all parameters have the same dtype\n",
    "\n",
    "# Count the number of parameters in the task_specific_model\n",
    "num_params_task_specific = sum(p.numel() for p in task_specific_model.parameters())\n",
    "print(f'Task Specific Model has {num_params_task_specific} parameters.')\n",
    "\n",
    "# Print the data types of the parameters in the task_specific_model\n",
    "for p in task_specific_model.parameters():\n",
    "    print(f'Data type of the parameter in task_specific_model: {p.dtype}')\n",
    "    break  # We break after printing the first one assuming all parameters have the same dtype\n",
    "\n",
    "# Estimate the memory usage (in MB assuming parameters are stored as 32-bit floats)\n",
    "memory_usage_trained = num_params_trained * 4 / (1024 ** 2)\n",
    "memory_usage_task_specific = num_params_task_specific * 4 / (1024 ** 2)\n",
    "\n",
    "print(f'Estimated memory for trained_model: {memory_usage_trained} MB')\n",
    "print(f'Estimated memory for task_specific_model: {memory_usage_task_specific} MB')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e3e3de3e",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "id": "b641a5ff",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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ctUaFxengQMH6vHHH9ewYcOUkpKimJgYPfPMM/ryyy9VogSfw1FIDAD5EhERYQQGBub5b+7cufZ22dnZxgMPPGD07dvXYfkffvjBCAwMNL755hvDMAyjbdu2xtixYx3azJo1y/j6668NwzCMuLg4IzAw0Fi1apVTdY4aNcpo2bKl/fHw4cONJUuWOLT54osvjMDAQGPHjh2GYRjG4MGDjSZNmhgXLlywt9m9e7fRsmVL49dffzXefvtto0aNGsbevXvt8y9cuGC0a9fOeO+994z4+HijV69extatWx2e57XXXjOCg4PtjyMiIoxatWoZ58+ft0/75ptvHF4XwzCM8+fPG2FhYQ7rkZczZ84YgwcPNmrUqGH/XTz44INGVFSUceLECXu7P/74wwgMDDSWLVvmsPzQoUON0aNHG8nJyUatWrVy/T62bt1qBAYGGu+8845hGIYRGxtrBAYGGps3b3aoISQkxBg3bpzDsh988IERGBho/PHHH3nW/u233xqBgYHG2rVrHabPnj3bCAwMNA4cOODwnFezatUqIzAw0IiLizPGjBljPPLII/Z5qampRt26dY3Nmzc79JWVlWU0adLE6N27t0NfR44cMYKDg43JkycbhmEYkyZNMkJCQoyTJ0/a2+zatcsIDAw0Ro0aZRiGYRw+fNioUaOGMW/ePIe+YmJijNq1axtJSUmGYVz8/UdERBiGYRiffPKJERgYaMTHx9vb796925g2bZpx9uzZq64v4AxGdAAnBAcHa8KECZIufiI/c+aMNm3apJiYGKWmpmrYsGE6fPiw4uPjNWDAAIdDFw0bNpSXl5c2b96sFi1aKCwsTO+//74SEhLUsmVLNW/ePM9Pvtdr6tSpki4eWjpy5Ij+/PNPff3115IuHs6RpO3bt6t58+Zyd3e3L1enTh17u0WLFqlixYoKCgqyz3d3d3c48XX58uWSLo54HDlyRIcOHdKOHTvsz5GjYsWK8vT0tD/etm2bXF1dHQ6reHp6qnnz5tq6detV183b21uxsbE6evSoNm7cqC1btmjLli1aunSpPvjgAy1atEj16tXTtm3bJElt2rRxWH769OmSpI0bNyojI0MdO3Z0mN+gQQMFBARoy5Yt6tGjh316YGCg/eedO3cqLS1NrVq1cvh95xxu3Lx5s+69995ctf/8889ycXFR+/btHaZ36tRJM2bM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giswMFCdOnXSyy+/rGPHjqlWrVr6888/FRMTo4oVK+Y50hUeHq7o6GgNGjRIERERcnFx0fvvvy83Nze1bNmywOsO5FLMJ0MDt4y8rrqqXbu20aFDB+PNN980MjIyHNp/+umnxmOPPWbUqlXLaNSokfHss88a+/bts88/e/as8dprrxktWrQwgoODjQceeMCYNGmSkZaWZm/z+uuvG3Xr1jUaNGhgpKen51nXp59+ajzyyCNG7dq1jZYtWxrz5883srOz7fN/+ukno0uXLkadOnWMxo0bG3369DG2bdtmhIaGGm+88Ya93c6dO42IiAh7u9GjRztcaRMfH28MHz7caNiwoREaGmr07t3b2LNnj33+22+/bbRu3dqoVauW0aJFC2PUqFHG+vXrjcDAQOPbb7+1v4Y5V91cKjU11Xj11VeNsLAwo27dusaLL75oTJw48ZpXXRmGYaxbt854+umnjbCwMCM4ONho3LixMXjwYIcrxAzDMNLT042pU6caDzzwgFG7dm2jU6dOxmeffebQ5t133zXat29vBAcHG02aNDHGjx9vJCcn2+df7Qqot99+277s/fffb4wYMcI4duzYVWtPTU01Jk2aZDRr1swIDg422rZtayxYsMDIzMzM13PmuPSqqxyvvvqqERgY6PA7yquvzz//3HjssceM4OBgIywszBg5cqRx/PhxhzZ///23MWDAAKNu3bpGkyZNjCVLlhj/+te/7FddGYZh2Gw2Y9asWUbr1q3t7+dXXnnFOH36tL3N5b//7777znjiiSeMevXqGSEhIUbPnj2Nn3/++arrCjjLYhh8YyAAADAnztEBAACmRdABAACmRdABAACmRdABAACmRdABAACmRdABAACmddvfMHDnzp0yDMPh5lcAAODmZrPZZLFY8rzz96Vu+xEdwzDErYRuD4ZhKCMjg983YGJs57eP/P79vu1HdHJGci7/RmqYT2pqqvbu3avq1avL09OzuMsBUATYzm8fv/76a77a3fYjOgAAwLwIOgAAwLQIOgAAwLQIOgAAwLQIOgAAwLQIOgAAwLQIOgAAwLQIOgAAwLQIOgAAwLQIOgAAwLQIOgAAwLQIOgAAwLQIOgAAwLQIOgAAwLQIOgAAwLQIOritWK3W4i4BAHADsdcvYsmpGTp7IbO4y4CkrKxMGZ6+SjyfKZcLqcVdDiR5e1jl4+lW3GUAMDGCThE7eyFT3+5PVFpGVnGXctuzZWYqKemUfH1T5crITrEr6eaiFjX8CDoAihR7+xsgLSNL5wk6xc5my9TZtAy5p2fKNdtS3OUAAG4AztEBAACmRdABAACmRdABAACmRdABAACmRdABAACmRdABAACmRdABAACmRdABAACmRdABAACmRdABAACmRdABAACmRdABAACmRdABAACmRdABAACmRdABAACmRdABAACmRdABAACmRdABAACmRdABAACmRdABAACmRdABAACmRdABAACmRdABAACmRdABAACmRdABAACmRdABAACmRdABAACmRdABAACmRdABAACmRdABAACmRdABAACmRdABAACmRdABAACmRdABAACmVexBJzs7W7GxsWrWrJlCQkLUp08fHTlyJF/Lfvzxx6pRo4aOHj1axFUCAIBbUbEHnTlz5uj999/XxIkTtWLFClksFvXv318ZGRlXXe7YsWOaMGHCDaoSAADcioo16GRkZGjx4sUaPHiwmjdvrqCgIMXExCghIUHr16+/4nLZ2dmKjIxUcHDwDawWAADcaoo16Ozbt0/nz59XeHi4fVrp0qVVs2ZNbd269YrLzZ07VzabTQMGDLgRZQIAbiFWq7W4S8BNpFjfDfHx8ZKkChUqOEz38/PTiRMn8lzml19+0eLFi7Vy5UolJCQUeY0AcE1pp6ULZ4q7Ckhyy8pSQKksuaXGS+kuxV0OJMmjtFSybLE9fbEGnbS0NEmSm5ubw3R3d3elpKTkap+amqqRI0dq5MiRqlKlSqEFHcMwlJqaWih9XS4rK1O2zEzZbJlF0j/yLzPT5vA/ipethKGsrMwi2/ZuJLfU0zL++FLKuPXX5VZny7IpM+WMMsqUluHiWtzlwM1TlsCHlGG4F3rXhmHIYrFcs12xBh0PDw9JF8/VyflZktLT01WyZMlc7SdOnKgqVaroiSeeKNQ6bDab9u7dW6h9SheHTw1PXyUlndLZtKufXI0bJzk5ubhLgKT0km5KTvZUyvEkZWbeuh8ErFarAkplKTM+TtmM6tw0kvld3BRKeJSW1S9Zx46dLZLt/PKBkrwUa9DJOWSVmJioypUr26cnJiYqKCgoV/tVq1bJzc1NoaGhkqSsrCxJ0iOPPKJOnTrp1VdfLVAdrq6uql69eoGWvZbE85ny9U2Ve/qtuyM3i8xMm5KT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RVEPAABAoXH60NVff/2lbdu26aGHHpKHh4d8fX0d5lssFm3YsKHQCgQAACgop4NOhQoV1LFjx6KoBQAAoFA5HXRef/31oqgDAACg0DkddHKcPHlSNptNhmFIkrKzs5WWlqZt27ape/fuhVYgAABAQTkddPbt26fhw4frzz//zHO+xWIh6AAAgJuC00Fn8uTJOnPmjEaNGqVvvvlGbm5uatmypTZt2qRNmzZp+fLlRVEnAACA05y+vHz37t0aOnSoevfurQ4dOig1NVU9evTQ3Llz9eCDD+qtt94qijoBAACc5nTQycjI0D333CNJqlq1qvbv32+f16VLF+3atavQigMAALgeTgedu+66y36zwLvvvlvnzp3T0aNHJUlubm5KSUkp3AoBAAAKyOmg89BDDyk6Olqff/65ypcvr6pVqyomJkb79+/X4sWLValSpaKoEwAAwGlOB53nn39e9evX16pVqyRJY8aM0YYNG/Too4/qp59+0uDBgwu9SAAAgIJw+qord3d3xcbGymazSZKaNWumTz75RL/99puCg4NVuXLlQi8SAACgIJwe0ZGkrVu3au7cufbHKSkp+vTTT5WcnFxYdQEAAFw3p4PON998o969e+unn36yT7NarTp+/Lh69uyprVu3FmqBAAAABeV00Jk1a5Y6deqkd955xz4tKChIq1ev1iOPPKJp06YVaoEAAAAF5XTQOXz4sDp37pznvE6dOmnfvn3XXRQAAEBhcDrolC5dWocPH85z3pEjR1SqVKnrLgoAAKAwOB102rVrpxkzZujbb791mL5x40bFxsbqoYcecqq/7OxsxcbGqlmzZgoJCVGfPn105MiRK7Y/cOCAnnnmGYWFhalx48YaMmSIjh8/7uxqAACA24DTQWfo0KGqWrWqnn32WdWuXVvNmjVT7dq1NWDAAFWuXFnDhw93qr85c+bo/fff18SJE7VixQpZLBb1799fGRkZudqePn1aTz/9tEqVKqW3335bCxYs0OnTp9WvXz+lp6c7uyoAAMDknL6Pjqenp959911t2rRJ27ZtU3Jysry9vdWgQQO1aNFCJUrkPztlZGRo8eLFioyMVPPmzSVJMTExatasmdavX68OHTo4tN+wYYPS0tI0adIkubu7S5KmTJmi5s2ba8eOHWrcuLGzqwMAAEzM6aAjXbxvjmEYGjFihCQpLi5O33zz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sECtW7dWSEiIOnfurI8++qhI1wXmZhiGFi5cqIcffli1atVS/fr1NWDAAMXFxdnbbNy4UV26dFFISIgaN26s0aNHKyUlJc/+duzYodDQUEVHR1/xOdPS0jR27Fg1adJEtWvX1qOPPqovv/zSPr9Xr16KiorSCy+8oLp16+qBBx7Q/Pnzdem3Dh06dEj9+/dXaGiomjZtqhEjRuiff/5xeJ633npLbdu2VZ06ddS+fXutXbtWkuMho9GjR2vmzJk6fvy4atSooZkzZ9oPa+dITU3VxIkT1bRpU4WGhqpnz5765ZdfnHuhJfvr+8knn+SqQ5L++usv9e3bV/Xr11doaKj69u2r/fv321+Tn3/+WR9++KH9ENWlh67y6/J96rX2KTmHJhcsWKCwsDA99thjat68uY4dO6ZZs2apV69eTr8OtxKCDorUL7/8oo8//ljdunUrlP7i4uI0ZcoU3XXXXWrYsGGh9HklAwYMUFJSkhYtWqTPP/9c/fr109y5c/X111/b2xw7dkwJCQn68MMPNWLECCUkJOipp55SQECAVq1apXHjxikmJkZZWVn2ZWJiYvTuu+/qpZde0scff6wnn3xS48eP1zvvvFOk6wPzWrZsmebNm6fIyEh98cUXmjNnjv78809NmjRJkpSUlKTnn39ejz/+uNatW6dZs2Zp69atmjx5cq6+du/erf79++upp57SyJEjr/icM2bM0P79+zV//nytW7dODzzwgIYNG+Zwns+7776rkiVLatWqVRo2bJhmz56tBQsWSJISEhLUo0cPVapUSStXrtTcuXN17tw5PfHEE0pNTZUkLVq0SNHR0erbt68++eQT9ezZU2PGjNHmzZsdahk7dqz69Okjf39/ff/99/ZDPZcaNmyYvvnmG0VFRWnNmjW655571LdvXyUlJTn9egcGBmrv3r15zhs+fLj8/Py0atUq/e9//1OJEiX0/PPPS7p4Dk5oaKgefvjhKx6+v5a89qn53ad8++23WrFihaKiovThhx/K399fffr0cTpo3Wo4dIVCNW/ePC1evFiSZLPZZLPZFBIS4nAuwfHjxxUaGpprWW9vb23atMlh2qXtbDabXF1d1bRpU73++uvy9PQsorW4eCy8c+fOatu2rQICAiRd/DQ2f/587d+/Xw8++KC97XPPPadKlSpJkmJjY1W6dGn997//laurq6pXr66XX35ZAwcOlHTxU+XSpUs1efJktWzZUpJUuXJlHTt2TIsWLWIoGgVSuXJlTZo0yT5KEBAQoIcffth+0mtCQoIyMjJ01113KSAgQAEBAZo7d65DAJek33//XWPHjtXTTz9t/+N8JX///be8vLxUuXJleXt7a+jQoWrQoIHDuSpVq1bV+PHjZbFYVK1aNR06dEjLly9X//799d5778nPz0/jxo2zt58+fbrCw8P1+eefq0uXLlq6dKmefPJJ/fvf/5Yk9ezZUxcuXMhVt7e3tzw9Pa94GOnPP//Ut99+q4ULF9rP6Rs3bpxKlSql5OTkax4+ulzp0qV17ty5K74uTZo0UcWKFWW1WhUVFaXDhw8rOztbPj4+9sPr+X3Oa+1Tndmn9OnTR1WqVLE/dnFxkaenp3x8fJxa/1sNQQeF6oknnrAPg2ZmZuqvv/5STEyMevTooVWrVkmS/Pz89NZbb+VatkSJ3AOMa9askST9888/io2N1alTp/Sf//xHFStWzHdNHTp00PHjx+2PFyxYIH9//6su4+HhoYiICH3++edatmyZjhw5on379ikxMdF+6CrHpTuOPXv2KDg4WK6urvZpDRo0sP988OBBpaena9SoURozZox9emZmpjIyMnThwoXrPq8At59WrVpp9+7dio2N1ZEjR3To0CEdOHBAd955pyTpvvvu0yOPPKJnn31WFSpU0P33368WLVo4XOEjSSNHjpTNZnPYvo4fP24/cTbHzp071b9/fz377LNq3LixQkND1aRJE3Xo0MHhXKJGjRrJYrHYH9etW1cLFizQ6dOntWfPHh06dCjXh5709HQdOnRISUlJSkxMVEhIiMP8vn37SpJTV4jlHDq69PwdNzc3h23QGWfPnpWXl1ee84YNG6aoqCi99957Cg8PV7NmzfTwww/nuX/Lj2vtU/OzT8lx6b7qdkLQQaEqU6aM7r77bvvjatWqqUyZMurZs6d++OEHSZLVanVoczU57e6++27NmzdP//rXv9S3b199+OGHKlu2bL76mD9/vjIzM+2P77zzTp08efKqy6Slpalnz55KS0vTww8/rM6dO+vll1/Oc8Tl0mDi4uKSKwhdKuf8hOnTp6tq1aq55ru5uV1zfYDLLViwQDNnzlSXLl3UqFEj9erVS1999ZXDZcxTp07VoEGDtGnTJv3www8aPny46tWrp+XLl9vbDBo0SCkpKYqKitL9998vPz8/+fn52T9wXCo0NFQbN27U5s2b9eOPP2rlypWaOXOmFi5cqMaNG0u6uK1fKuf9n7OdhIeH65VXXsnVt7e3t31buDQoFVROHYXRl3Rx5Cs4ODjPeT179lS7du20ceNG/fjjj5o2bZpmzpypNWvW6I477nD6ua61T83ZD+Znn3K1q7vMjHN0cMNcLQDkR8mSJRUdHa2TJ0/q1VdfzfdyAQEBuvvuu+3/8jNi8t133+n333/XW2+9pSFDhqh9+/by8vLSqVOnHE6mvFxQUJB+//132Ww2+7Tdu3fbf65ataqsVquOHz/uUNPGjRu1aNGiAn/qw+3tzTff1PPPP6/x48erW7duqlu3rv766y/7e3XXrl2KiopS1apV1bt3b82fP19RUVHasmWLTp06Ze/nkUce0dChQ1W6dGn7IaWcDyaX/pMuHqbdvn27WrdurZdeeklffPGFKlWqpC+++MLe36+//upQ544dO1SxYkWVKVNG9957rw4dOqQKFSrY+y1TpoyioqL0xx9/yMvLS35+frn6GDJkiCZOnOjU61OtWrVc9WRmZqpFixYOYTA/fvvtN+3atUsdO3bMNS9n32Sz2dSlSxdNmTJFH330kf755x/9/PPPTj1PfmRnZ7NPyQdGdFCoUlNT7VdNGIahv//+W1FRUfLz81Pjxo31+++/KysrK9eVFTlKlix5xSFh6WKQ6Nevn95880117Ngx19C7s3755Relp6c7TPPz87Mf2vroo4/Utm1bnThxQtOmTZPNZlNGRsYV++vRo4eWLFmil19+Wf3791diYqI9lFksFnl7e+uJJ57Q9OnTVapUKdWvX1/btm3TlClT1L9//+taF9y+KlSooM2bN6tVq1YqUaKE1q5dqy+//NI+guDl5aV3331Xrq6u+ve//60LFy7o008/VZUqVXKNjHp4eOi1115T7969tXbtWnXu3DnP5zxy5Ig++ugjvfbaa6pcubJ27dqV6/y7bdu2KTY2Vh07dtT27dv1zjvv2A+v9OjRQytWrNDw4cM1aNAgWSwWTZkyRXv27NG9994rSXrmmWc0bdo0ValSRfXq1dN3332nr776SosWLXLq9bnnnnv00EMPacKECXrllVfk7++vBQsWKCMjwz76lJezZ8/a91U599GZOnWqwsLC1KlTp1ztfXx89O233+rvv//WiBEj5OXlpZUrV8rV1VW1atWSJJUqVUrHjh1TfHz8NQ+h5zzv1fapJUuWLPA+pVSpUvrrr7908uTJAo023SoIOihUixcvtp84V6JECZUtW1b169dXdHS0/ZLI+Ph4NW3aNM/lu3Xrds3Rmueee05ffPGFJkyYoEaNGl01GF1LXpfPduzYUdHR0RozZoyWLl2q6dOn684771T79u1VoUIFhxGay5UrV04LFy5UVFSUOnfuLH9/f3Xv3l2TJ0+2n7czZswY+fr6KjY2VomJifL399fzzz+vZ555psDrgdvb5MmT9eqrr+rxxx9XqVKlFBISogkTJmj8+PE6evSoqlevrpkzZ2rWrFl69913VaJECYWHh2vBggV5fuJv3LixunTpYj+EldcJvhMmTNAbb7yhyMhIJScnKyAgQCNHjnQIRq1bt9aBAwfUuXNn+fn5afTo0erevbuki/eDefvttzV16lT16NFDLi4uqlu3rpYtW6Zy5cpJkiIiIpSenq7Y2Fj9888/qlKlimJiYhQeHu70XZxff/11TZ48WcOGDVN6erpCQkK0ePHiq54UHBUVpaioKEkXw2LFihXVs2dPPfnkk3ne3sJqtWrBggV644031Lt3b6Wlpem+++7T/PnzVblyZUkXz7kZNWqUOnXqpB9//PGadednn1rQfUqvXr30xhtv6MCBA6a+xYXFuNo4PACnHDx4UCkpKapfv7592o4dO9S9e3d9++23qlChQjFWB9w4vXr1UkBAgP0Sd6C4cPAOKEQJCQl68skntWbNGh07dkw7d+7U66+/rkaNGhFyAKAYcOgKKERNmjTR2LFjNW/ePL388svy9vZWq1atrnrjNQBA0eHQFQAAMC0OXQEAANMi6AAAANMi6AAAANMi6AAAANMi6AAAANMi6AAAANMi6AAAANMi6AAAANMi6AAAANP6fy0cuSpLirWhAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# Model names\n",
    "models = ['BERT-Large', 'Task-specific DistilBert']\n",
    "\n",
    "# Estimated memory usage (in MB)\n",
    "memory_usage = [.455674, 0.402424]\n",
    "\n",
    "# Create a figure and a set of subplots\n",
    "fig, ax = plt.subplots()\n",
    "\n",
    "# Generate a bar plot with patterns\n",
    "bars = ax.bar(models, memory_usage, align='center', alpha=0.5, color=['#1f77b4', '#ff7f0e'])\n",
    "\n",
    "# Add labels and title\n",
    "ax.set_ylabel('Jaccard Score')\n",
    "ax.set_title('Best Jaccard Score of Models')\n",
    "\n",
    "# Display the plot\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "aa7eb287",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "id": "21e6d6b6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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JsbuMfr4448ZPXo0L730EgCtWrXCz8+P8ePH89VXXxEaGsq7775L/fr1mTNnDgBPPPEEgPU2wKZNmzhx4gQffvghQUFB1na9e/cmMjLS7n4z7d27l4CAAHr16oWTkxMtWrTAw8ODa9eu3XM/RQqLRo5EigE3Nzfatm1rd2pty5YthIWFYTAY7Np+9913WCwW2rZti9lstv5r27YtqampdqMLNWrUsAYjgHLlyuHj42N90Qbw9va2jrocOnSItLQ0unTpYnefzZs3JyAggL1799ot//Nclx49enDgwAHraboNGzZQpUqVbCcS50bmY/DII4/g4+PDSy+9xLRp09i9ezflypVj/Pjx1snsEydOZNy4cdy4cYMff/yRTz/9lLVr1wK3wyLcfgxDQ0OtwQhuB7uAgADr7T179mAwGAgNDc3yOF++fJlff/0121r37dtHkyZN7B5jgK5du3L58mV+++23PD0GHTt2tDu1tmXLFtq0aWMNWbb3D2T5P+zUqRPOzs7s3buXlJQUjh49Srt27bLch609e/ZQrlw56tevb93/9PR0/vKXv/DTTz/ZnWrNFBISwpkzZ+jevTsLFy7k2LFjdOnShb59++Zpv0UKgkaORIqJjh07Mnz4cM6dO0fJkiXZs2cPo0ePztIuISEBINvTKQCXLl2y/v7nF07ALhD8WeaLXdmyZbOsK1u2bJb5RH9uFxYWRkREBJs3b2bQoEFs27btni+KHh4e1n3KTlpamrXmkiVLsnbtWhYtWsTWrVtZt24d7u7udO3alcmTJ1OiRAl+//13pk6dynfffYfRaKR69erUrl0bwHpK6erVq9l+QqxcuXLW3xMSErBYLDRt2jTbuuLi4qhbt26W5YmJiVSqVCnL8szH6vr163fc17sJCwtjyZIlHDhwgGbNmvHZZ58xffr0bO8f7PcFwGg0UqZMGW7cuEFiYiIWiwUfHx+7Nn5+fna3ExISuHz5MvXr18+2psuXL9uF78w6MzIyeP/991mwYAHz5s0jICCAl19++Y5/syKFTeFIpJh44okn8PT0ZMeOHXh6elKpUiUaNGiQpZ2XlxcAq1atomTJklnWV6xYMc81ZL7QXblyhRo1atitu3z5cpbRkD8rWbIkHTp0YNu2bdStW5fr16/zt7/97a7blC1bll9++SXbdWlpaVy9etUuhFWvXp3Zs2eTnp7O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iIiI2LivcJSamsqVK1f07dgiIiLywMj114d89dVXbN68me+++474+Hjg9he5lS1bltatW9OxY0cef/zxfC9UREREpDDkOBzt3buXN998k59//pkmTZrQqVMnAgICcHd35/r161y8eJGDBw/yySefUKdOHV5++WVatWpVkLWLiIiI5LschaM33niDzz//nD59+rBkyRLKly9/x7ZxcXF8+OGHTJgwgSeffJLp06fnV60iIiIiBS5H4cjT05MdO3bg7u5+z7Z+fn6MGDGCfv36sXTp0vsuUERERKQw5SgcjRkzJtcdlypVirFjx+Z6OxERERFHuu+P8l+9epUjR45w7dq1/KhHRERExKFyPCH71KlTbNiwAYPBQM+ePQkMDGTevHksW7aM9PR0nJ2d6dmzJ6+99hrOzs4FWbOIiIhIgclRONq/fz8DBw7EycmJEiVKsHbtWl566SUWL15Mz549qVOnDj/88APr1q2jYsWKDBkypKDrFhERESkQOQpHCxYsoEWLFsyfPx93d3fmzJnD3Llz6du3LxMnTgSgV69elC1blk8//VThSERERIqtHM05OnbsGM8//7z102p9+/bFYrHwxBNP2LV78skn+eOPP/K/ShEREZFCkqNwdOPGDXx8fKy3vb29AfDy8rJr5+LiQmpqav5VJyIiIlLIcvxpNdtJ1gaDwe6niIiIyIPivj7Kr3AkIiIiD5ocf5R/+vTplCpVCgCLxQLAa6+9RsmSJa1tbt68mc/liYiIiBSuHIWj4OBg4P+HojstK1myJM2bN8/P+kREREQKVY7C0erVqwu6DhEREZEi4b6/PkRERETkQZKjkaM+ffrkuEODwcCqVavyXJCIiIiII+UoHO3btw+DwcAjjzxC6dKl79rWdg6SiIiISHGTo3A0aNAgtm/fzm+//UarVq3o1KkTTz75JB4eHgVdn4iIiEihytGco1deeYXPP/+ctWvXEhgYyJw5c3jssccYPXo0n3/+OWlpaQVdp4iIiEihyPF1jgCCgoIICgpi4sSJ7N+/n61btzJ16lTS0tJo3749nTp14rHHHsPJSfO8RUREpHjKU4oxGAy0aNGC6dOn8/XXXxMVFYWTkxMvvfQSrVu3zu8aRURERArNfQ/xHDx4kN27d/Pf//4Xk8lk9wW1IiIiIsVNrk6rZTpw4ADbt2/ns88+Iy4ujmrVqvHM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8fT0pEWLFoSGhuZ4JriIiIhIUZTni0C2atUq23lHIiIiIsVZrsPRpEmT7rjOyckJDw8PAgMDCQsLo0yZMvdVnIiIiEhhy3U4io2N5eDBg6SmphIQEEC5cuWIj4/n3LlzODk5UbZsWeLj41m0aBEffPABlStXLoi6RURERApErj+t9pe//AVPT0/WrVvHrl27WLduHTt37mTDhg2UL1+eYcOG8c0331CpUiXefvvtgqhZREREpMDkOhytXLmSl19+2XoBxkx169blH//4B0uWLKF06dIMGDCAvXv35ledIiIiIoUi1+Ho2rVr+Pj4ZLuudOnSxMfHA+Dj40NSUtL9VSciIiJSyHIdjurVq8fy5cutF4DMlJaWxooVK6hbty4AR48etX5prIiIiEhxkesJ2a+88gr9+/enbdu2tGnTBl9fX+Lj4/nyyy+5efMmy5cv58CBA7z99tu89NJLBVGziIiISIHJdThq0qQJMTExLFmyhP/+979cvXoVf39/WrduzYsvvkiVKlXYs2cPo0aNYuDAgQVRs4iIiEiBydNFIGvUqMGsWbPuuL5ly5a0bNkyz0WJiIiIOEqewlHmtY5s5x1lZGSQnJzMgQMHmDt3br4VKCIiIlKYch2Otm3bxrhx4zCbzdbvUbNYLNbfq1evnr8VioiIiBSiXH9abcmSJdSrV48NGzbQvXt3unbtypYtWxg3bhxGo5FXX321IOoUERERKRS5Hjk6ffo0kZGR1KtXj5YtW7J8+XJq1KhBjRo1iI+PZ/HixfpCWhERESm2cj1y5OTkhLe3NwCBgYH89ttvZGRkANC6dWtOnjyZrwWKiIiIFKZch6Pq1avz/fffA7fDkclk4vjx4wBcv349y8UhRURERIqTXJ9We+6555g2bRpJSUmMHTuWRx99lFdffZWePXuyZs0a6tevXxB1ioiIiBSKXI8cPfPMM0yePBmTyQTAG2+8QWpqKjNnzsRsNjN58uR8L1JERESksOTpOke9evWy/l6lShW2bdt21y+kFRERESku8hSObt68ya1btyhfvjxpaWn8+9//JjY2lqeeeorg4OD8rlFERESk0OT6tNqRI0do27Ytq1evBmDGjBlERkayefNm+vbty65du/K9SBEREZHCkutwNHfuXKpXr86zzz5LSkoKn376KS+88AL79u2jZ8+eLF68uCDqFBERESkU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HBxMdHR0vs6NEhERkQeDwWKxWHKzwWuvvUb//v2pXr36XdvdunULNzc366muB8mPP/4I3A6A+e2Pq0ls+/Eit9LS871vyR2TycSVK5cpW7acTqsVESVdnenYsAKVfXTqQ/JPUlISx48fp27dujqt9oDL6et3rq9ztHfvXk6cOHHPdiVLlnwgg5GIiIg82HIdjhITEylTpkxB1CIiIiLicLkOR3369GHWrFl89913XL16tSBqEhEREXGYXE/I3rRpExcuXKB///7ZrjcYDPk2EVtERESksOU6HHXt2rUg6hAREREpEnIdjkaMGFEQdYiIiIgUCXm6QnZaWhobNmxg7969XL9+nTJlytC8eXO6detm/dJXERERkeIo1+Ho+vXr9OnThxMnTlCxYkXKlSvH6dOn+c9//sPatWt5//338fT0LIhaRURERApcrj+tNmfOHGJjY1mzZg27d+9m/fr17N69mzVr1hAfH8+8efMKok4RERGRQpHrcLRr1y5Gjx5t9yWwAM2bN2fUqFF89tln+VaciIiISGHLdTi6desWlStXznZd5cqVSUhIuN+aRERERBwm1+GoevXq/N///V+263bt2kXVqlXvuygRERERR8n1hOyBAwcyduxY0tLS6NKlC2XLluXKlSt8+umnfPTRR0yfPr0AyhQREREpHLkOR2FhYZw5c4bFixfz0UcfAWCxWHB1dWX48OE8++yz+V6kiIiISGHJ03WOhg0bRnh4OD/88APXr1+ndOnSBAUFUbp06fyuT0RERKRQ5SkcAXh5eREaGpqftYiIiIg4XK7D0YULF3jjjTc4ePAgN27cyLJeXzwrIiIixVmuw9HkyZM5dOgQPXr0wNvbuwBKEhEREXGcXIejQ4cO8dprr9G9e/eCqEdERETEoXJ9naNy5cpp4rWIiIg8sHIdjoYOHcq7777L+fPnC6IeEREREYfK9Wm1Nm3asHz5cp588kl8fHxwc3OzW28wGPj888/zrUARERGRwpTrcDRp0iT++OMPWrVqRbly5QqiJhERERGHyXU42rdvH1OnTuXvf/97QdQjIiIi4lC5nnPk5eVFxYoVC6IWEREREYfLdTh64YUXWLp0KTdv3iyIekREREQcKk9XyD527BiPP/441atXp1SpUnbrDQYDq1atyrcCRURERApTrsPR6dOnqVu3rvW2xWKxW//n2yIiIiLFSa7D0erVqwuiDhEREZEiIdfhKFNiYiIHDhwgLi6Op556ioSEBKpVq4bBYMjP+kREREQKVZ7C0aJFi1iyZAkpKSkYDAYaNWrE3LlzSUhIYMWKFXh5eeV3nSIiIiKFItefVluzZg3z58+nf//+fPjhh9Y5Rn379uWPP/5g3rx5+V6kiIiISGHJdThavXo1Q4YM4R//+Af169e3Lm/dujWjR49m9+7d+VqgiIiISGHKdTi6cOECLVq0yHZd9erVuXLlyn0XJSIiIuIouQ5HFSpU4Icffsh23U8//USFChXuuygRERERR8n1hOyePXsyf/583NzcaNOmDQBJSUns2LGDJUuW0L9///yuUURERKTQ5DocDR48mHPnzhEZGUlkZCQAffr0AaBLly4MHTo0fysUERERKUS5DkcGg4E33niD/v37891335GYmIinpyctWrTgkUceKYgaRURERApNni8CWa1aNapVq5aftYiIiIg4XI7C0aRJk3LcocFgICIiIs8FiYiIiDhSjsLRJ598gsFgoHz58jg53f0Dbvr6EBERESnOchSOOnbsyBdffEFqaiodO3akU6dONGvWrKBrExERESl0OQpHc+fOJSUlhd27d7N161b69++Pr68vnTp1olOnTtStW7eg6xQREREpFDm+CKSbmxthYWEsWLCAb7/9llGjRvHzzz/zzDPP0KFDBxYsWMBvv/1WkLVy+vRpmjRpwoYNG6zLjh8/Tnh4OI0bN6ZNmzZER0fbbZORkUFUVBStW7cmKCiIAQMGcPbs2QKtU0RERIqvXF8hG6BUqVJ069aNZcuW8fXXXzNw4EAOHjxI165d6d69e37XCIDJZOKVV14hKSnJuuzatWv079+fwMBAYmJiGDlyJPPmzSMmJsbaZuHChaxbt44ZM2awfv16DAYDgwcPJi0trUDqFBERkeItT+HIVlJSEjdv3iQpKYn09HTOnz+fH3VlMX/+fEqWLGm37MMPP8TV1ZXp06dTo0YNevToQb9+/Vi2bBkAaWlprFixgpEjRxIaGkqdOnWYO3culy5dYufOnQVSp4iIiBRveQpHsbGxrFy5kmeffZZ27dqxcOFCAgMDWbx4Md98801+18j+/ftZv349b731lt3yAwcOEBwcjNH4/6dOhYSEcPr0aeLj4zlx4gS3bt0iJCTEut7Ly4t69eqxf//+fK9TREREir8cXwTy0qVLbNu2je3bt3Po0CE8PDz4y1/+wpAhQ2jdujWurq4FUuD169cZP348U6ZMyfKltrGxsdSqVctumZ+fHwAXLlwgNjYWIMt2fn5+XLx4sUDqFRERkeItR+Ho+eef5/Dhw5QoUYLQ0FCioqIIDQ2lRIkSBV0f06dPp3HjxnTp0iXLupSUlCyhLLOm1NRUkpOTAbJtk5iYeF91WSwWu/lP+SU93YzJbMZkMud735I7ZrPJ7qc4nsnJQnq6uUCee/LwynytyPwpDy6LxZKj6zHmKBz98MMPODs7U7NmTa5evcqaNWtYs2ZNtm0NBgOrVq3KXbV3sHHjRg4cOMCnn36a7Xo3N7csE6tTU1MB8PDwwM3NDbg99yjz98w27u7u91WbyWTi+PHj99XHnxmNRiwePly9Gs+NZE0YLyoSEhIcXYL8T6q7KwkJHiReuIrZrDcQkr/OnDnj6BKkEOTkTFeOwlFwcLD1d4vFcte291qfGzExMcTHx9OmTRu75dOmTSM6OpqKFSsSFxdnty7zdvny5a0Hz7i4OKpUqWLXpk6dOvdVm4uLCzVr1ryvPrITd8uMj08SJVJ14Hc0s9lEQkIC3t7eGI0uji5HgJIljHh7l8YvwNfRpcgDJDk5mTNnzhAYGHjfb5ylaDt58mSO2uUoHK1evfq+ismryMhIUlJS7Jb99a9/ZdSoUYSFhbFlyxbWrVtHeno6zs7OAOzZs4dq1arh6+uLp6cnpUqVYu/evdZwdP36dY4dO0Z4ePh91WYwGPDw8LivPrLjnJKEi9GIS4a+hqWoMBpdcHFROCoKXIzOODsbC+S5J+Lu7q6/rQdcTr/iLMcTsh2hfPny2S739fUlICCAHj16sHz5ciZPnsygQYM4cuQIq1at4vXXXwduD52Fh4cTGRmJj48PAQEBzJ49G39/f9q3b1+YuyIiIiLFRJEOR/fi6+vL8uXLmTlzJt26daNcuXKMHz+ebt26WduMGjUKs9nMlClTSElJITg4mOjo6AL7dJ2IiIgUb8UuHP388892txs1asT69evv2N7Z2Zlx48Yxbty4gi5NREREHgD3fYVsERERkQeJwpGIiIiIDYUjERERERsKRyIiIiI2FI5EREREbCgciYiIiNhQOBIRERGxoXAkIiIiYkPhSERERMSGwpGIiIiIDYUjERERERsKRyIiIiI2FI5EREREbCgciYiIiNhQOBIRERGxoXAkIiIiYkPhSERERMSGwpGIiIiIDYUjERERERsKRyIiIiI2FI5EREREbCgciYiIiNhQOBIRERGxoXAkIiIiYkPhSERERMSGwpGIiIiIDYUjERERERsKRyIiIiI2FI5EREREbCgciYiIiNhQOBIRERGxoXAkIiIiYkPhSEREHnpGo9HRJUgRor8GERFHSL4GKdcdXYUArunpBJRMxzUpFlKdHV2OALh5gXsZh929wpGIiCOkXIdfd4IpydGVPPQsJjPmq/FYfHzBRS+LDufiAY+0VzgSEXkomZIg7ZajqxCTiYyU65BWAiwujq5GigDNORIRERGxoXAkIiIiYkPhSERERMSGwpGIiIiIDYUjERERERsKRyIiIiI2FI5EREREbBT5cJSQkMDUqVN54oknaNq0Kc8//zwHDhywrj9+/Djh4eE0btyYNm3aEB0dbbd9RkYGUVFRtG7dmqCgIAYMGMDZs2cLezdERESkmCjy4Wjs2LEcPnyYt99+m48//pj69eszcOBATp06xbVr1+jfvz+BgYHExMQwcuRI5s2bR0xMjHX7hQsXsm7dOmbMmMH69esxGAwMHjyYtLQ0B+6ViIiIFFVF+grZZ8+e5ZtvvuGDDz6gadOmAEyePJmvvvqK//znP7i5ueHq6sr06dMxGo3UqFGDs2fPsmzZMnr06EFaWhorVqxg3LhxhIaGAjB37lxat27Nzp076dSpkyN3T0RERIqgIj1yVKZMGZYuXUqDBg2sywwGAxaLhcTERA4cOEBwcLDdtymHhIRw+vRp4uPjOXHiBLdu3SIkJMS63svLi3r16rF///5C3RcREREpHop0OPLy8iI0NBRXV1frsm3btvH777/z+OOPExsbi7+/v902fn5+AFy4cIHY2FgAKlSokKXNxYsXC7h6ERERKY6K9Gm1P/v+++959dVXadeuHW3btuXNN9+0C04AJUqUACA1NZXk5GSAbNskJibeVy0Wi4WkpPz/Nu30dDMmsxmTyZzvfUvumM0mu5/ieCYnC+np5gJ57hU21/R0LCYzmPT35Wim/z3HTXquFw0GM4b0dNIK4HlusVgwGAz3bFdswtHnn3/OK6+8QlBQEG+//TYAbm5uWSZWp6amAuDh4YGbmxsAaWlp1t8z27i7u99XPSaTiePHj99XH39mNBqx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e+01Bg8eTFxcnDXIGQwGPD09ee6553jnnXcoWbIkzZo148CBA8yePZvBgwff177Iw6tChQp88803tG3bFicnJzZt2sRnn31mHakoVaoU77//Pi4uLvz9738nJSWFLVu2EBgYmGUE1s3NjX/+85/069ePTZs28fTTT2d7n2fPnmXz5s3885//pEqVKhw6dCjLfMIDBw4QFRVFly5d+P7771m7dq311M8LL7zA+vXrGTt2LMOHD8dgMDB79myOHTvGI488AsCQIUN4++23CQwMpGnTpvz3v/9l165dREdH5+rxqVatGn/96195/fXXmTZtGv7+/ixbtoy0tDTrKFd2bty4YT1WZV7naM6cOTz66KN07do1S3tvb2+++OILfv/9d15++WVKlSrFxx9/jIuLCw0aNACgZMmSnD9/ntjY2Hue3s+837sdU93d3fN8TClZsiRnzpzhypUreRrVKi4UjsThVqxYYZ086OTkRJkyZWjWrBmRkZHWj5/Gxsby+OOPZ7v9s88+e89RoWHDhrFjxw5ef/11WrRocdcwdS/ZfVS5S5cuREZGMmnSJFauXMk777xD+fLlCQsLo0KFCnYjQX/m6+vL8uXLiYiI4Omnn8bf35/nn3+eWbNmWechTZo0CR8fH6KiooiLi8Pf358RI0YwZMiQPO+HPNxmzZrFG2+8QY8ePShZsiRBQUG8/vrrTJ8+nXPnzlGzZk3mz5/PggULeP/993FyciIkJIRly5ZlO7LQsmVLunfvbj29lt0k59dff5233nqLcePGkZCQQEBAAK+88opdmGrXrh2//vorTz/9NH5+fkycOJHnn38euH29njVr1jBnzhxeeOEFnJ2dady4MatWrcLX1xeA8PBwUlNTiYqK4vLlywQGBjJ37lxCQkJyfTXvN998k1mzZjFmzBhSU1MJCgpixYoVd50YHRERQUREBHA7YFaqVIlevXrRp0+fbC8lYjQaWbZsGW+99Rb9+vUjOTmZunXrsnTpUqpUqQLcnkM0YcIEunbtyp49e+5Zd06OqXk9pvTu3Zu33nqLX3/99YG+nIjBcrfxfhEpcCdPniQxMZFmzZpZlx08eJDnn3+eL774ggoVKjiwOpHC07t3bwICAqyXExBxFJ1YFHGwS5cu0adPHzZu3Mj58+f54YcfePPNN2nRooWCkYiIA+i0moiDtWrVismTJ7NkyRJee+01PD09adu27V0vpiciIgVHp9VEREREbOi0moiIiIgNhSMRERERGwpHIiIiIjYUjkRERERsKByJiIiI2FA4EhEREbGhcCQiIiJiQ+FIRERExIbCkYiIiIiN/wdABZG+Pe54oAAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# Model names\n",
    "models = ['BERT-Large', 'Task-specific DistilBert']\n",
    "\n",
    "# Estimated memory usage (in MB)\n",
    "memory_usage = [1278.63, 255.53]\n",
    "\n",
    "# Create a figure and a set of subplots\n",
    "fig, ax = plt.subplots()\n",
    "\n",
    "# Generate a bar plot with patterns\n",
    "bars = ax.bar(models, memory_usage, align='center', alpha=0.5, color=['#1f77b4', '#ff7f0e'])\n",
    "\n",
    "# Add labels and title\n",
    "ax.set_ylabel('Memory Usage (MB)')\n",
    "ax.set_title('Memory Usage of Models')\n",
    "\n",
    "# Display the plot\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "id": "53b9c230",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAi4AAAG1CAYAAADeA3/CAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA/i0lEQVR4nO3deVhU5f//8dfIooAg4AbhllquoKi5K0alaS5p+cm9ct/SUMutUjPR3FBxxUxzzVIzW9RPVi6ZuZt+tExNzH0HFxBmcH5/+GV+oogzCI1Hn4/r4oI5y33eM8ycec2573PGZLVarQIAADCAHM4uAAAAwF4EFwAAYBgEFwAAYBgEFwAAYBgEFwAAYBgEFwAAYBgEFwAAYBgEFwAAYBgEF+AhwzUhHwyPX8Z4fGB0BBc8FgYNGqRSpUpl+BMeHq6tW7eqVKlS2rp1q1PqPHz4sFq3bu2UbTvLihUrVKpUKZ04ceKB2/rxxx81cOBAh9YpVaqUoqOjH3jb6Tlz5ozatWun4OBg1ahRQ4mJiRkubzab1bJly3TrSU5O1sSJE1WvXj2FhISoadOm+v777zNsLzo6WqVKlbLd3rlzp7p165a5OwM8JFydXQDwb+jZs6datWpluz19+nQdOHBAU6dOtU1zd3dXkSJFtHTpUpUsWdIZZWr16tXavXu3U7b9KJg3b56zS0jjs88+0+7duzVu3DgVLFhQHh4e91z2xo0beuedd7R3717VrVv3rvkDBgzQL7/8ogEDBqhYsWL6+uuv1a9fP+XOnTvd5SWpZcuWqlOnju32l19+qcOHDz/4HQOciOCCx0KRIkVUpEgR221/f3+5u7urYsWKdy2b3jQgM+Li4lSgQAE1atQow+V27NihESNG6Ny5c+nO3759u9auXauYmBiFhYVJkmrUqKFjx45p48aN9wwuAQEBCggIeLA7ATxk6CoCbnNnV1F0dLRefPFFrVu3To0bN1ZwcLCaNWum3bt3a8+ePWrZsqVCQkLUuHFjbdmyJU1bf/31l7p166ZKlSqpUqVK6tWrl44fP37PbUdHR9uOAN3efZGUlKRp06bpxRdfVHBwsOrXr6+YmBjdvHnznm2dOHFCpUqV0ty5c9WwYUNVrVpVK1asuKvrINXt20tdd/Xq1erTp49CQ0P1zDPPaOjQobp+/XqGj9+ff/6p3r17q3r16ipXrpzq1Kmjjz76SDdu3MhwPUnatWuXXn75ZQUHB6tJkyZ3dYOcOHFC7777rmrXrq1y5cqpRo0aevfdd3X58mVJUvv27bVt2zZt27Ytzf/w4sWLGjJkiGrWrKnQ0FC1bdtWO3fuTNP2tWvXNHToUFWtWlWhoaHq06ePLl68mGG9V69e1ejRo/X8888rODhYjRs31rJly2zzw8PDtWLFCp06deq+3VE9evRQUFCQVqxYke78tWvXqnDhwrbQIkkmk0mff/653nvvvXu2e/v/e9CgQfrqq6908uRJlSpVyratpKQkjR07VmFhYSpfvny6j314eLimTp2q0aNHq1q1agoNDVX//v11/fp1xcTEqG7duqpcubLeeust2/9Dkvbv36/XX39dlStXVmhoqN544w39/vvvGTyqwP1xxAW4jzNnzmj06NGKiIiQh4eHRo4cqT59+sjNzU09evSQn5+fJk6cqIiICK1fv165cuXS0aNH1apVKxUvXlxjxoxRSkqKZsyYodatW+vrr79W3rx579pOy5YtdebMGS1btkxLly5VQECArFarunfvrj179qhXr14qU6aMtm7dqkmTJun48eMaOXJkhrVHRUXpgw8+kI+Pj8qXL6/ly5fbfb+HDRumV155RdOnT9fevXsVFRUlf39/9e/fP93lz507p7Zt26pixYoaM2aM3N3dtX79en322WfKly+funfvnuH23n//ffXo0UNly5bVV199pYiICPn4+Kh27dpKTExUhw4d5Ofnp2HDhsnb21s7d+7UtGnTlDNnTo0cOVLDhg3TO++8Y6u9ZMmSSkhIUKtWrWQ2m9W/f38FBATos88+U+fOnbVs2TKVKFFCkjR//nw1adJEkydP1qFDhzR27FhJ0pQpU9Kt9caNG2rTpo0uXLigt956S4ULF9a6des0dOhQXbhwQd27d9fUqVM1adIkW5dkRkc+Fi5cmG6gTPXnn3/q6aef1jfffKPp06fr2LFjKlKkiCIiItSgQYMMH9dUPXv21KVLl2z1FClSRFarVb169dKuXbvUp08flShRQj/88IMiIiKUnJysl19+2bb+3LlzVbNmTUVFRWnfvn2aOHGi9u/fr4IFC2rkyJE6evSoxo4dq3z58mnYsGG6du2aOnfurGrVqmnKlCkym82aMWOGOnXqpJ9//lne3t521Q3cieAC3EdiYqKGDRtmOxx/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Vu/evdWnTx8VLlxYP/30k5YvX67evXvb/o9ZpUmTJlq4cKEGDBig/v37q2DBgpo/f77OnDmjyZMn292Oj4+PLly4oA0bNqhMmTIKCwvTM888o549e6pnz54qUaKE9u7dq+joaNWuXduhbs07VapUSTdv3rQNuvby8tLq1at19epV1a9fP9PtAhxxAbJB6dKltWjRIplMJr377rvq06ePzp8/r2nTpmW4065fv76Cg4M1aNAgzZkzRyaTSbNmzVKrVq00f/58de3aVWvWrFFERIRGjRrlcF1PPvmkPv74Y506dUpdu3bVZ599ppEjR6pAgQIPcnclyRbS5s+fry5dumjOnDlq1qyZevfurUOHDik+Pj7D9UeNGqX58+erZ8+eOnv2rGbPnq2qVatKkpo3b65evXpp9erV6tKli6ZMmaIqVaroww8/VFxcnO1qsG3btpWbm5u6dOmijRs3Knfu3Fq4cKFCQ0M1atQo9e3bV0lJSVqwYEGaCxI6ysPDQwsWLFB4eLimTJmiHj16aOfOnRo1apTeeuutTLd7L25ubpo7d64aNGigqKgovfXWW7p+/brmzZuXZtzL/bRo0UJBQUHq1auXVq5cqRw5cigmJkYvvfSSZs2apU6dOunzzz/XG2+8oaioqAequUCBAvrkk0/k7e2toUOHqlu3btq/f7+io6NVvXr1B2objzeTlW/cAgAABsERFwAAYBgEFwAAYBgEFwAAYBgEFwAAYBgEFwAAYBgEFwAAYBiP1AXodu/eLavVKjc3N2eXAgAA7GQ2m2UymRQaGnrfZR+pIy5WqzXDL0bDo8NqtSo5OZn/N/CI47X+eHDk/fuROuKSeqQlODjYyZUguyUkJOiPP/5QyZIl7/pmXwCPDl7rj4eMviz1To/UERcAAPBoI7gAAADDILgAAADDILgAAADDILgAAADDILgAAADDILgAAADDILgAAADDILgAAADDILgAAADDILgAAADDILgAAADDILgAAADDILgAAADDILgAAADDcHV2AcDp06d1+vRph9ZJTExUbGysbty4IQ8PD4fWDQwMVGBgoEPrAAAeDgQXON2sWbM0YsSIf217w4YN0/Dhw/+17QEAsg7BBU7XrVs3NW3a1O7lExMTVbt2bUnSunXr5Ofn59D2ONoCAMZFcIHTOdp1c/36ddvfISEhyp8/f3aUBQB4CDE4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Ro1Up04d2zJvvfWWAgICNHToUNu0PHnyZNn9A5xh6NCh6t+/v+127dq1NWTIEDVq1MiJVTlXYGCgfvnlF9vre+XKldq6dasWLlyoggULys/PT2FhYQ+0jdsf44SEBO3du1cff/yx9uzZozlz5sjV1fWuOu5n4MCBCgoK0ksvvSRJWrZsmXLmzHnP5e3Zp2ZWt27d1Lx5c9WrV++B2jECggvuydPTU/nz57fdLly4sLZu3arly5fbXmQuLi5plsnIncsFBATogw8+ULt27fTbb78pPDxcuXLlss13c3NTrly57G4fMAJvb295e3vfNe1xfp7fuR+5evWq8ufPr4oVK9qm3b5vyIw7H+OiRYvqySef1KuvvqqVK1fq1VdfdWh/lh5/f/8M59uzT8X90VUEh3h4eGRpe6mfTlxcXLK03TudOXNGAwYMUM2aNVWuXDmFhYUpKipKN2/elHSrmyo8PFyjRo1SlSpV1L17d0nS//73P7Vt21YVKlTQc889p1WrVqls2bK2Q8lWq1WzZ8/Wc889pwoVKqhZs2ZatWpVtt4XPNqsVqs++eQTNWzYUOXLl1flypXVrVs3HT9+3LbMhg0b1KJFC1WoUEE1atTQoEGDFB8fn257u3btUmhoqMaPH3/PbSYmJmro0KGqVauWgoOD9fLLL+u///2vbX779u0VGRmpd999VxUrVlTdunUVExOj278x5siRI+rSpYtCQ0NVu3Zt9e/fX+fPn0+znQULFqhBgwYKCQlRo0aN9PXXX0tK20UzaNAgRUdH69SpUypVqpSio6Nt3cipEhIS9NFHH6l27doKDQ1V27ZttXfvXsceaMn2+H777bd31SFJsbGx6tSpkypXrqzQ0FB16tRJBw8etD0m27Zt01dffWXrErq9q8hed+5T77dPSe0KnD17tqpVq6bmzZsrLCxMJ0+e1NSpU9W+fXuHHwejIbjAbnv37tU333yj1157LUvaO378uMaNG6cnnnhCzzzzTJa0eS/dunXTpUuXNGfOHK1Zs0adO3fWzJkz9dNPP9mWOXnypM6ePauvvvpK/fv319mzZ/X6668rKChIy5cv1wcffKCoqCilpKTY1omKitLixYv13nvv6ZtvvlGHDh00fPhwLVq0KFvvDx5dn332mWbNmqV33nlHa9eu1fTp03X06FGNGTNGknTp0iX17t1br7zyir7//ntNnTpV27dv19ixY+9q6/fff1eXLl30+uuva8CAAffc5uTJk3Xw4EHFxMTo+++/V926dRUREZFmnMzixYvl4eGh5cuXKyIiQtOmTdPs2bMlSWfPnlWbNm1UuHBhLVu2TDNnztS1a9fUqlUrJSQkSJLmzJmj8ePHq1OnTvr222/Vtm1bDR48WJs3b05Ty9ChQ9WxY0cFBATol19+sXWt3C4iIkI///yzIiMjtXLlSj355JPq1KmTLl265PDj/fTTT+uPP/5Id16/fv1UoEABLV++XF9++aVy5Mih3r17S7o1hiU0NFQNGza8Z3f5/aS3T7V3n7J+/XotXbpUkZGR+uqrrxQQEKCOHTs6HJyMiK4i3NOsWbP06aefSpLMZrPMZrMqVKiQpi/+1KlTCg0NvWtdb29vbdy4Mc2025czm81yc3NT7dq1NXr0aHl6embTvbjVl9ysWTM1aNBAQUFBkm59WoqJidHBgwf1/PPP25bt2bOnChcuLEmaMmWKfHx8NGrUKLm5ualkyZJ6//331aNHD0m3PvXNmzdPY8eO1bPPPitJKlKkiE6ePKk5c+Zw6BeZUqRIEY0ZM8b2KT4oKEgNGza0DQI9e/askpOT9cQTTygoKEhBQUGaOXNmmkAtSfv379fQoUP15ptv2t5s7+Wff/5R7ty5VaRIEXl7e6tv376qUqVKmrEexYsX1/Dhw2UymVSiRAkdOXJE8+fPV5cuXbRkyRIVKFBAH3zwgW35SZMmqXr16lqzZo1atGihefPmqUOHDvrPf/4jSWrbtq1u3LhxV93e3t7y9PS8Z7fN0aNHtX79en3yySe2MXEffPCBvLy8FBcXd9/umjv5+Pjo2rVr93xcatWqpUKFCsnV1VWRkZH6+++/dfPmTfn6+tq6s+3d5v32qY7sUzp27KhixYrZbru4uMjT01O+vr4O3X8jIrjgnlq1amU77GixWBQbG6uoqCi1adNGy5cvlyQVKFBACxYsuGvdHDnuPpi3cuVKSdL58+c1ZcoUXbx4UW+//bYKFSpkd00vvfSSTp06Zbs9e/ZsBQQEZLhOrly51K5dO61Zs0afffaZjh07pj///FPnzp2zdRWlun1HcODAAZUrV05ubm62aVWqVLH9ffjwYSUlJWngwIEaPHiwbbrFYlFycrJu3LjxwP3yePyEh4fr999/15QpU3Ts2DEdOXJEhw4dUsGCBSVJZcqUUePGjdW9e3cFBgaqZs2aqlevXpozWCRpwIABMpvNaV5fp06dsg0kTbV792516dJF3bt3V40aNRQaGqpatWrppZdeSjMWp2rVqjKZTLbbFStW1OzZs3X58mUdOHBAR44cuetDTFJSko4cOaJLly7p3LlzqlChQpr5nTp1kiSHzoBK7aq5ffyLu7t7mtegI65evarcuXOnOy8iIkKRkZFasmSJqlevrjp16qhhw4bp7t/scb99qj37lFS376seNwQX3FOePHlUtGhR2+0SJUooT548atu2rX799VdJkqura5plMpK6XNGiRTVr1iy1bNlSnTp10ldffSU/Pz+72oiJiZHFYrHdLliwoC5cuJDhOomJiWrbtq0SExPVsGFDNWvWTO+//366R0RuDxouLi53BZvbpfbvT5o0ScWLF79rvru7+33vD3Cn2bNnKzo6Wi1atFDVqlXVvn17/fjjj2lOu50wYYJ69eqljRs36tdff1W/fv1UqVIlzZ8/37ZMr169FB8fr8jISNWsWVMFChRQgQIFbB8gbhcaGqoNGzZo8+bN2rJli5YtW6bo6Gh98sknqlGjhqRbr/XbpT7/U18n1atX17Bhw+5q29vb2/ZauD34ZFZqHVnRlnTryFS5cuXSnde2bVu9+OKL2rBhg7Zs2aKJEycqOjpaK1euVL58+Rze1v32qan7QXv2KRmdvfSoY4wLMiWjN3R7eHh4aPz48bpw4YI+/PBDu9cLCgpS0aJFbT/2HNHYtGmT9u/frwULFqhPnz5q1KiRcufOrYsXL6YZXHin0qVLa//+/TKbzbZpv//+u+3v4sWLy9XVVadOnUpT04YNGzRnzpxMfyrD423GjBnq3bu3hg8frtdee00VK1ZUbGys7bm6Z88eRUZGqnjx4nrjjTcUExOjyMhIbd26VRcvXrS107hxY/Xt21c+Pj62LpzUDxq3/0i3ukV37typ5557Tu+9957Wrl2rwoULa+3atbb29u3bl6bOXbt2qVChQsqTJ4+eeuopHTlyRIGBgbZ28+TJo8jISP3111/KnTu3ChQocFcbffr00UcffeTQ41OiRIm76rFYLKpXr16acGeP//3vf9qzZ4+aNGly17zUfZPZbFaLFi00btw4rVq1SufPn9e2bdsc2o49bt68yT7FThxxwT0lJCTYzgqwWq36559/FBkZqQIFCqhGjRrav3+/UlJS7jpzIJWHh8c9D8FKt4JB586dNWPGDDVp0uSuQ92O2rt3r5KSktJMK1CggK0radWqVWrQoIFOnz6tiRMnymw2Kzk5+Z7ttWnTRnPnztX777+vLl266Ny5c7aQZTKZ5O3trVatWmnSpEny8vJS5cqVtWPHDo0bN05dunR5oPuCx1dgYKA2b96s8PBw5ciRQ19//bX++9//2j7h586dW4sXL5abm5v+85//6MaNG/ruu+9UrFixu45c5sqVSyNHjtQbb7yhr7/+Ws2aNUt3m8eOHdOqVas0cuRIFSlSRHv27Llr/NqOHTs0ZcoUNWnSRDt37tSiRYts3Rlt2rTR0qVL1a9fP/Xq1Usmk0njxo3TgQMH9NRTT0mSunbtqokTJ6pYsWKqVKmSNm3apB9//FFz5sxx6PF58sknVb9+fY0YMULDhg1TQECAZs+ereTkZNvRofRcvXrVtq9KvY7LhAkTVK1aNTVt2vSu5X19fbV+/Xr9888/6t+/v3Lnzq1ly5bJzc1N5cuXlyR5eXnp5MmTOnPmzH27rFO3m9E+1cPDI9P7FC8vL8XGxurChQuZOhpkJAQX3NOnn35qG0iWI0cO+fn5qXLlyho/frztFL4zZ86odu3a6a7/2muv3fdoSs+ePbV27VqNGDFCVatWzTDo3E96p3s2adJE48eP1+DBgzVv3jxNmjRJBQsWVKNGjRQYGJjmCMqd8ubNq08++USRkZFq1qyZAgIC1Lp1a40dO9Y27mXw4MHy9/fXlClTdO7cOQUEBKh3797q2rVrpu8HHm9jx47Vhx9+qFdeeUVeXl6qUKGCRowYoeHDh+vEiRMqWbKkoqOjNXXqVC1evFg5cuRQ9erVNXv27HQ/kdeoUUMtWrSwdRmlN+B1xIgR+vjjj/XOO+8oLi5OQUFBGjBgQJqg89xzz+nQoUNq1qyZChQooEGDBql169aSbl2PZOHChZowYYLatGkjFxcXVaxYUZ999pny5s0rSWrXrp2SkpI0ZcoUnT9/XsWKFVNUVJSqV6/u8FV+R48erbFjxyoiIkJJSUmqUKGCPv300wwHyUZGRioyMlLSrfBXqFAhtW3bVh06dEj3cgyurq6aPXu2Pv74Y73xxhtKTExUmTJlFBMToyJFiki6NWZl4MCBatq0qbZs2XLfuu3Zp2Z2n9K+fXt9/PHHOnTo0CN/SQaTNaNj5cBj7PDhw4qPj1flypVt03bt2qXWrVtr/fr1CgwMdGJ1wL+nffv2CgoKsp2SDTgTHWbAPZw9e1YdOnTQypUrdfLkSe3evVujR49W1apVCS0A4CR0FQH3UKtWLQ0dOlSzZs3S+++/L29vb4WHh2d4IS8AQPaiqwgAABgGXUUAAMAwCC4AAMAwCC4AAMAwCC4AAMAwCC4AAMAwCC4AAMAwCC4AAMAwCC4AAMAwCC4AAMAw/h8qUY0nWG7cjAAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# Model names\n",
    "models = ['BERT-Large', 'Task-specific DistilBert']\n",
    "\n",
    "# Times taken to run a batch of 16 items (in seconds)\n",
    "times = [8.65, 1.35]\n",
    "\n",
    "# Standard deviations\n",
    "std_devs = [0.121, 0.017]\n",
    "\n",
    "# Create a figure and a set of subplots\n",
    "fig, ax = plt.subplots()\n",
    "\n",
    "# Generate a bar plot\n",
    "ax.bar(models, times, yerr=std_devs, align='center', alpha=0.5, ecolor='black', capsize=10,  color=['#1f77b4', '#ff7f0e'])\n",
    "\n",
    "# Add labels and title\n",
    "ax.set_ylabel('Time (seconds)')\n",
    "ax.set_title('Time to run a batch of 16 items')\n",
    "\n",
    "# Display the plot\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6c24e62f",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "bb41d334",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
